赞
踩
确保主服务器和从服务器上都安装了 MySQL。可以使用 Yum 来安装Mysql 5.7:
sudo rpm -Uvh https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
#导入GPG公钥,或者禁用gpg检查,将gpgcheck=1 更改为 gpgcheck=0
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
## 在 [mysql57-community] 部分,将 enabled=0 更改为 enabled=1,在 [mysql80-community] 部分,将 enabled=1 更改为 enabled=0
sudo vim /etc/yum.repos.d/mysql-community.repo
sudo yum install mysql-community-server-5.7.42
编辑 MySQL 配置文件。通常位置是 /etc/my.cnf 或 /etc/mysql/my.cnf。
[mysqld]
server-id=1
log_bin=mysql-bin
保存配置文件并重启 MySQL 服务:
sudo systemctl restart mysqld
mysql安装完了以后会生成一个初始密码在mysqld.log文件
grep password /var/log/mysqld.log
如果要更简单的密码:
SET GLOBAL validate_password_length = 6;
SET GLOBAL validate_password_number_count = 0;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
在主服务器上登录 MySQL 并创建一个用于复制的用户:
SET GLOBAL validate_password_policy=LOW; #临时降低密码策略的强度
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'rep123456';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
FLUSH PRIVILEGES;
记录主服务器的二进制日志坐标。在主服务器上执行:
SHOW MASTER STATUS;
记下 File 和 Position 的值,从服务器会用到这些信息来同步数据。
编辑从服务器的 MySQL 配置文件,设置一个唯一的 server-id:
[mysqld]
server-id=2
relay-log=relay-bin
主从复制在生产中通常要将从库设置为只读库,具有 SUPER 权限的用户依然可以在从服务器上执行写操作
read_only = ON
保存配置文件并重启 MySQL 服务:
sudo systemctl restart mysqld
在从服务器上设置复制并开始复制进程:
CHANGE MASTER TO
MASTER_HOST='10.75.78.212',
MASTER_USER='replication_user',
MASTER_PASSWORD='rep123456',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=3583;
START SLAVE;
主从同步复制模式:
主从同步复制模式默认使用的是异步复制
异步复制:主库在执行完客户端提交的事务后会立即将结果返给客户端,不关心从库是否已经接收并处理
全同步复制:主库执行完一个事务,所有的从库都执行了该事务才返回给客户端
半同步复制(用于至少有2个从库的模式):介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到 relay log 中才返回给客户端
在生产环境中,选择哪种复制模式通常取决于业务需求、数据一致性要求、性能影响以及系统复杂度等因素。许多生产环境为了平衡性能和数据一致性,会选择半同步复制。全同步复制(如MySQL Group Replication或其他第三方解决方案)提供更强的数据一致性保证,但可能会带来更大的性能开销和更复杂的配置。
-- 在主服务器上
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
-- 在从服务器上
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
-- 在主服务器上
SET GLOBAL rpl_semi_sync_master_enabled = 1;
-- 在从服务器上
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
以上是临时方法,重启后失效,永久生效可以将这些设置添加到MySQL的配置文件(通常是my.cnf或my.ini),以便在MySQL服务器启动时自动生效。
# 在主服务器的配置文件中
[mysqld]
rpl_semi_sync_master_enabled = 1
# 在从服务器的配置文件中
[mysqld]
rpl_semi_sync_slave_enabled = 1
SHOW VARIABLES LIKE 'rpl_semi_sync%';
SET GLOBAL rpl_semi_sync_master_timeout = 1000; -- 超时时间设置为1000毫秒
在MySQL中,默认的复制机制是异步复制。如果你想要将已经配置好的主从异步复制改成全同步复制,比如使用MySQL Group Replication或InnoDB Cluster,这通常涉及到比较多的步骤,因为这些技术提供了更高级别的数据一致性保证。以下是将异步复制切换到Group Replication的一般步骤:
确认和备份数据:确保所有数据是最新的,并进行备份。在从库上停止复制,并确保主库和从库的数据完全同步。
停止当前复制:
在从库上执行以下命令来停止复制:
STOP SLAVE;
[mysqld]
server_id = <唯一的服务器ID>
gtid_mode = ON
enforce_gtid_consistency = ON
binlog_checksum = NONE
log_bin = binlog
log_slave_updates = ON
binlog_format = ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_start_on_boot = OFF
在所有将要参与Group Replication的服务器上执行这些更改,并重启MySQL服务。
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
SET GLOBAL group_replication_group_name = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; # 组的UUID
SET GLOBAL group_replication_local_address = '本机IP:端口';
SET GLOBAL group_replication_group_seeds = '其他组成员的IP:端口列表';
SET GLOBAL group_replication_bootstrap_group= OFF;
SET GLOBAL group_replication_bootstrap_group = ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group = OFF;
然后,在其他实例上启动Group Replication,比如从库:
START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;
备注:如果master存在数据库,slave是空库,可以执行以下操作再执行步骤6
mysqldump --all-databases --master-data --single-transaction --flush-logs --routines --triggers --events -u root -p > all_databases.sql
mysql -u root -p < all_databases.sql
检查从服务器的复制状态:
SHOW SLAVE STATUS\G
查看 Slave_IO_Running 和 Slave_SQL_Running 两个状态,他们都是YES
主从复制原理:
二进制日志(Binary Log):
中继日志(Relay Log):
所以,整个过程是这样的:
在主库上:
在从库上:
在正常运行的复制环境中,从库会持续地从主库获取最新的二进制日志内容,并将其应用到自己的数据库中,保持与主库的数据一致性。这个过程在默认情况下是自动进行的。
在两台CentOS 7服务器上分别安装MySQL。这里安装mysql 5.7
sudo rpm -Uvh https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
#导入GPG公钥,或者禁用gpg检查,将gpgcheck=1 更改为 gpgcheck=0
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
## 在 [mysql57-community] 部分,将 enabled=0 更改为 enabled=1,在 [mysql80-community] 部分,将 enabled=1 更改为 enabled=0
sudo vim /etc/yum.repos.d/mysql-community.repo
sudo yum install mysql-community-server-5.7.42
安装完成后,启动MySQL服务并设置开机自启:
sudo systemctl start mysqld
sudo systemctl enable mysqld
在两台服务器上进行MySQL配置,以设置主主复制。
编辑MySQL配置文件/etc/my.cnf,在[mysqld]部分添加以下内容,确保两台服务器的server_id不同,并且为每个服务器指定唯一的log_bin文件名。
在主服务器1上:
[mysqld]
server_id=1
log_bin=mysql-bin
在主服务器2上:
[mysqld]
server_id=2
log_bin=mysql-bin
重启MySQL服务以应用更改:
sudo systemctl restart mysqld
在两台服务器上创建用于复制的用户。首先登录MySQL:
mysql -u root -p
然后,创建复制用户并授予权限(在两台服务器上执行,只需更改ip地址):
SET GLOBAL validate_password_policy=LOW; #临时降低密码策略的强度
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'rep123456';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
FLUSH PRIVILEGES;
在主服务器1上,查看二进制日志文件和位置:
SHOW MASTER STATUS;
记录下File和Position的值,这将用于配置服务器2。
在主服务器2上执行以下命令,配置主服务器1为复制来源:
CHANGE MASTER TO
MASTER_HOST='10.75.78.212',
MASTER_USER='replication_user',
MASTER_PASSWORD='rep123456',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=78846;
然后启动复制:
START SLAVE;
在主服务器1上执行类似的步骤,配置主服务器2为复制来源。
CHANGE MASTER TO
MASTER_HOST='10.75.79.3',
MASTER_USER='replication_user',
MASTER_PASSWORD='rep123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
然后启动
START SLAVE;
在两台服务器上创建测试数据库或表,并进行更改,查看更改是否会在另一台服务器上同步。
sudo rpm -Uvh https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
#导入GPG公钥,或者禁用gpg检查,将gpgcheck=1 更改为 gpgcheck=0
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
## 在 [mysql57-community] 部分,将 enabled=0 更改为 enabled=1,在 [mysql80-community] 部分,将 enabled=1 更改为 enabled=0
sudo vim /etc/yum.repos.d/mysql-community.repo
sudo yum install mysql-community-server-5.7.42
sudo systemctl start mysqld
sudo systemctl enable mysqld
grep 'temporary password' /var/log/mysqld.log
mysql_secure_installation
这个过程将提示你设置root密码以及移除匿名用户等。
[mysqld]
server_id=1 # 每个节点应该有唯一的server_id
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" # 使用UUID生成器生成,所有节点要用相同的UUID
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="this_host_ip:33061" # 替换为当前主机IP和端口
loose-group_replication_group_seeds="seed1_ip:33061,seed2_ip:33061,seed3_ip:33061" # 替换为其他节点的IP和端口,但不包括自己的
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode=ON
loose-group_replication_enforce_update_everywhere_checks=OFF
#Group Replication复制用户的凭据,用户在下面的步骤有创建
loose-group_replication_recovery_user='replication_user'
loose-group_replication_recovery_password='rep123456'
多主模式的话还需要再每个节点配置
[mysqld]
loose-group_replication_single_primary_mode=OFF
loose-group_replication_enforce_update_everywhere_checks=ON
备注
方法 1:使用 uuidgen 命令(Linux)
大多数 Linux 发行版都自带了 uuidgen 命令,你可以用它来生成 UUID。
打开终端并输入以下命令:
uuidgen
这将输出一个新的 UUID,例如:
e24df29e-7e95-11eb-9439-0242ac130002
方法 2:使用 MySQL 函数
如果你在 MySQL 客户端中,可以使用内置的 UUID() 函数来生成 UUID:
SELECT UUID();
这将返回一个新的 UUID,例如:
e24df29e-7e95-11eb-9439-0242ac130002
方法 3:使用在线 UUID 生成器
你可以简单地搜索“在线 UUID 生成器”,并使用任何在线服务来生成 UUID。
方法 4:使用编程语言生成
几乎所有的现代编程语言都提供了生成 UUID 的库。例如,使用 Python:
import uuid
print(str(uuid.uuid4()))
或者使用 Node.js:
const { v4: uuidv4 } = require('uuid');
console.log(uuidv4());
在生成 UUID 后,你可以将其复制并粘贴到 MySQL 配置文件的 group_replication_group_name 配置项中:
[mysqld]
loose-group_replication_group_name="e24df29e-7e95-11eb-9439-0242ac130002" # 替换为你生成的 UUID
确保你为集群中的所有节点使用相同的 UUID。更改配置文件后,你需要重新启动 MySQL 服务来使新的配置生效。
sudo systemctl restart mysqld
SET GLOBAL validate_password_policy=LOW; #临时降低密码策略的强度
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'rep123456';
GRANT ALL PRIVILEGES ON *.* TO 'replication_user'@'%';
FLUSH PRIVILEGES;
在引导节点上配置
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
在其他节点配置
CHANGE MASTER TO MASTER_USER='replication_user',
MASTER_PASSWORD='rep123456' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;
查看start group_replication状态
SHOW GLOBAL STATUS LIKE 'group_replication_primary_member'; # 查看start group_replication状态
SHOW GLOBAL STATUS LIKE 'group_replication_members'; #查看组成员
备注:
如果报错mysql> SET GLOBAL group_replication_bootstrap_group=ON;
ERROR 1193 (HY000): Unknown system variable ‘group_replication_bootstrap_group’
原因 Group Replication 插件可能没有被正确安装或启用,Group Replication 是从 MySQL 5.7.17 版本开始引入的,低于这个版本不支持
SHOW PLUGINS;
确认在输出结果中 group_replication 插件的状态是否为 ACTIVE。
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
请注意,插件的名称在不同的操作系统中可能有所不同,例如,在 Windows 上可能是 .dll 文件。
sudo yum install mysql-router
mysqlrouter --bootstrap root@10.75.78.212:3306 --directory /etc/mysqlroute --user=root
mysqlroute的配置文件在/etc/mysqlroute,鉴于安全考虑–user选择安全的数据库账户,比如创建一个只能够读写业务库的账号
如果你的部署是 Group Replication 而非 InnoDB Cluster(因为没有找到 mysql_innodb_cluster_metadata 数据库),需要手动配置 MySQL Router。这意味着不能使用 --bootstrap 选项来自动配置 MySQL Router,因为这个选项是为 InnoDB Cluster 设计的,它依赖于集群的元数据
以下是手动配置方法:
vim /etc/mysqlrouter/mysqlrouter.conf
[DEFAULT]
logging_folder=/var/log/mysqlrouter
runtime_folder=/var/run/mysqlrouter
config_folder=/etc/mysqlrouter
data_folder=/var/lib/mysqlrouter
[logger]
level = INFO
[routing:write]
bind_address = 0.0.0.0
bind_port = 6446
destinations = 10.75.78.212:3306
routing_strategy = first-available
protocol = classic
[routing:only_read]
bind_address = 0.0.0.0
bind_port = 6447
destinations = 10.75.79.3:3306
routing_strategy = round-robin
protocol = classic
[routing:all_only_read]
bind_address = 0.0.0.0
bind_port = 6448
destinations = 10.75.78.212:3306,10.75.79.3:3306
routing_strategy = round-robin
protocol = classic
运行mysqlrouter
mysqlrouter --config /etc/mysqlrouter/mysqlrouter.conf
sudo systemctl start mysqlrouter
sudo systemctl enable mysqlrouter
测试下 round-robin 策略
[root@iZwz95tf7rz3vh3pzml5l1Z 18:18:28 mysqlrouter]# mysql -uroot -p123456 -P6448 -h10.75.79.3 -e "select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| k8s-master |
+------------+
[root@iZwz95tf7rz3vh3pzml5l1Z 18:18:33 mysqlrouter]# mysql -uroot -p123456 -P6448 -h10.75.79.3 -e "select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------------------+
| @@hostname |
+-------------------------+
| iZwz95tf7rz3vh3pzml5l1Z |
+-------------------------+
备注
除了round-robin还有
mysqlsh --uri root@primary_node_ip:3306
然后在MySQL Shell中运行:
var cluster = dba.getCluster();
print(cluster.status());
SHOW STATUS LIKE 'group_replication%';
现在,你应该有一个运行中的MySQL InnoDB Cluster。务必在实际生产环境中部署之前进行充分的测试,并且确保你有适当的监控和备份策略。
请注意,这是一个简化的部署指南,每个环境的具体细节可能会有所不同。在执行以上步骤之前,建议详细阅读MySQL官方文档,以了解所有配置选项和最佳实践。
除了mysqlrouter轻量级数据库客户端连接管理,还有
更重量级的场景,您可能需要一个更为强大和灵活的数据库中间件或负载均衡器来处理 MySQL 的连接和流量分发。以下是几个流行的选项:
ProxySQL:
HAProxy:
MariaDB MaxScale:
MySQL Group Replication / InnoDB Cluster:
Vitess:
选择哪个中间件取决于您的具体需求、预算、技术堆栈以及团队的经验。每种解决方案都有其独特的特点和配置要求,因此在选择之前需要仔细评估。在大型生产环境中,中间件的选择通常会考虑到性能、监控、灵活性和可维护性等因素。在选择任何中间件之前,建议进行充分的测试,以确保它满足您的性能要求并与您的基础架构兼容。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。