一,前言
mysql 集群是mysqL官方自myql5.7以后推出来的完整的高可用性解决方案,集群是建立在mysql组复制技术上面的,组复制是一种基于paxos
分布式一致性算法来实现数据的强一致性,也正因为是这种算法,才使得mysql集群能轻松的实现单点写故障以及水平扩展读能力,因此,mysql
集群要求mysql实例至少需要3个,但是最多实例官方建议是9个,因为过多的实例会使得数据同步会增加网络带宽,从而降低数据同步的效率。
目前mysql组复制有两种模式,一种是single-primary(单主模式),一种是multiple-primaries(多主模式);在默认的单主模式下,
InnoDB集群只有一个读-写服务器实例——主实例。多个辅助服务器实例是主服务器的副本。如果主服务器失败,则辅助服务器将自动提升
为主服务器角色。MySQL路由器检测到这一点并将客户端应用程序转发到新的主服务器。所以在接下来的配置中,本人将首先介绍组复制
的搭建,只要组复制搭建成功,mysql集群搭建将变得很简单。
二、mysql 组复制搭建,(多主模式、单主模式)
1、首先准备三台机器,IP地址分别是:192.168.0.112,192.168.0.113,192.168.0.130
2、安装mysql,本人使用的是5.7.23版本
2.1、首先从官网下载文件mysql57-community-release-el7-11.noarch.rpm
2.2、安装rpm库,使用命令 yum -y localinstall mysql57-community-release-el7-11.noarch.rpm
2.3、安装mysql实例,使用命令 yum -y install mysql-community-server
2.4、grep 'temporary password' /var/log/mysqld.log找到临时root密码,然后service mysqld start启动mysql服务
2.5、登录mysql后执行 set global validate_password_policy=0;set global validate_password_mixed_case_count=0;set global validate_password_number_count=3;set global validate_password_special_char_count=0;
set global validate_password_length=3;ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';修改root密码。然后在执行select uuid();会得到一个uuid字符串,这个一定要记住,后面配置组复制用到。
3、配置组复制必要的启动参数:
编辑/etc/my.cnf文件,加入如下配置
transaction-isolation=READ-COMMITTED (官方建议用这种隔离级别)
server_id = 1123306 (保证组内唯一)
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 = '60d06502-add4-11e8-af31-000c29fc4619' (通过select uuid();得到的)
loose-group_replication_start_on_boot = off
loose-group_replication_local_address = '192.168.0.112:33061'
loose-group_replication_group_seeds ='192.168.0.112:33061,192.168.0.113:33062,192.168.0.130:33063'
loose-group_replication_bootstrap_group = off(这个参数必须在所有的mysql实例中设置成off)
loose-group_replication_single_primary_mode=off (单主模式不需要配置)
loose-group_replication_enforce_update_everywhere_checks=true (单主模式不需要配置)
配置完成后,重启mysql服务。service mysqld restart.
注:在这里有必要说明一下,所有组内成员必须在/etc/hosts文件中配置ip 与 hostname的映射关系,因为组复制通讯是通过hostname来找到其他的成员机器,然后与之通讯的。
4、安装插件
install plugin group_replication soname 'group_replication.so';
5、创建复制用户,只需要在第一台启动集群的机器上创建就可以了,后续加入集群的mysql服务会自动的通过这个账号与组取得联系,同时也会因为你在第一台机器上面执行过创建复制账号留下的binlog日志,
使得这个复制账号同步到其他机器,这个过程可以通过在配置好重启后执行 show binlog events;查看到。
CREATE USER 'repl'@'%' IDENTIFIED BY '123456';(当然这个密码太简单了,如果不在需要加入组的机器上面设置降低mysql的密码安全策略等级,会使账号创建失败,最后组复制搭建失败)
6、给创建的用户赋权
grant replication slave on *.* to 'repl'@'192.168.0.%' identified by '123456';
flush privileges;
7、启动首个节点的MGR集群服务
change master to master_user='repl',master_password='123456' for channel 'group_replication_recovery';
8、初始化操作(只有首个节点需要这个步骤)
set global group_replication_bootstrap_group=ON;
9、启动组复制服务
start group_replication;
10、启动成功后关闭初始化
set global group_replication_bootstrap_group=off;
11、在剩下的机器中执行以下操作
set global group_replication_allow_local_disjoint_gtids_join=ON;(这个参数主要是让那些需要加入组的机器存在于组内冲突的事务才执行的,一般情况下不需要执行这个命令,这个参数官方说后续会废除掉)
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;
12、当中不管是因为什么原因导致组内成员服务停止,重启后都需要重启进行集群初始化操作。
13.1、参数loose-group_replication_group_name的值是通过select uuid()生成的,并且整个mgr集群中是唯一的,所以其他组成员应该将这个参数的值配置成跟第一台启动mgr集群的值一样。
13.2、如果在执行START GROUP_REPLICATION;中出现"不能将当前实例加入到组中"的错误时,这个时候需要发送semanage port -l | grep mysqld 命令来查看当前mysql允许使用哪些端口,如果没有你配置的端口,
要么修改端口,要么用semanage port -a -t mysqld_port_t -p tcp [port] 来添加响应的端口,然后使用命令systemctl restart sshd.service重启SELunix。当然这是官网给出来的解决方案,但是本人
用这个种方案来搭建发现只有第一个节点加入组会成功,剩下的节点加入组就会失败了,具体原因不是很清楚,所以本人建议关闭 SELinux
13.3、如何没有semanage,可以使用yum -y install policycoreutils-python来安装。
13.4、SHOW BINLOG EVENTS;这个命令可以查看到当前组复制同步数据的binlog日志,如果你想重新搭建,又不想卸载mysql实例,请先执行reset master; 用来重置所有的binlog,这样重新搭建财货成功。
14、上述步骤执行完成后,可以通过sql:select * from performance_schema.replication_group_members;来查看所有组内成员是否都是ONLINE状态。
单主模式下也可以直接执行sql:SELECT * FROM performance_schema.replication_group_members WHERE MEMBER_ID = (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member');来查找那个才是主机器
三、mysql集群搭建
好了,如果你的组复制搭建成功的话,那么在这一步将变的非常简单。
1、首先安装 MySQL Shell 和 MySQL Router,执行如下两条安装命令
yum -y install mysql-shell
yum -y install mysql-router
2、执行 mysqlsh 命令启动mysql shell,然后执行 shell.connect('[email protected]:3306'),来连接组内其中一台mysql实例,最好是连接组内任意一台secondary
3、执行 var cluster = dba.createCluster('prodCluster', {adoptFromGR: true});来创建集群实例。到此,集群搭建完成。
4、退出mysql shell,配置路由服务,执行 mysqlrouter --bootstrap root@hostname/ip:3306 --user=root.这个时候回打印出连接路由服务的端口号
5、启动路由服务 mysqlrouter &来创建集群实例。
四、结语
到目前为止,mysql集群搭建已经彻底完成,你可以用客户端连接路由服务了,来开启你的mysql集群之旅吧!!!
这些步骤都是通过官网的文档来一步一步的搭建完成,如果有上面不妥之处,还请大家指出。