首先我们来谈谈什么叫做组复制。
组复制是一种可用于实现容错系统的技术。复制组是一个通过消息传递相互交互的Server集群。复制组由多个Server成员组成,如下图的Master1、Master2、Master3,所有成员独立完成各自的事务。
当客户端发起一个更新事务时,该事务先在本地执行,执行完成之后就要发起对事务的提交操作。在还没有真正提交之前,需要将产生的复制写集广播出去,复制到其它成员。如果冲突检测成功,组内决定该事务可以提交,其它成员可以应用,否则就回滚。
最终,所有组内成员以相同的顺序接收同一组事务。因此组内成员以相同的顺序应用相同的修改,保证组内数据强一致性。
系统架构图:
vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
2、三台机器互相做免密认证
151、152、153分别执行以下操作
ssh-keygen -t rsa -b 2048
ssh-copy-id 192.168.52.150
ssh-copy-id 192.168.52.151
ssh-copy-id 192.168.52.152
3、同时关闭防火墙(顺手关了NM,可以不关)
systemctl disable firewalld && systemctl stop firewalld && systemctl stop NetworkManager && systemctl disable NetworkManager
4、安装基础软件
yum install -y gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools vim iotop bc iftop zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget epel-release telnet ntpdate yum-utils python-pip iostat
5、关闭selinux
vim /etc/selinux/config
修改主机名
vim /etc/hosts
192.168.52.150 m1
192.168.52.151 m2
192.168.52.152 m3
重启 shutdown -r now
6、安装mysql(centos7默认会安装mariadb,会自动替换为mysql)
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql-community-server
cp /etc/my.cnf /etc/my.cnf.bak
启动mysql
systemctl start mysqld
查看状态
systemctl status mysqld
查找mysql默认密码
grep "password" /var/log/mysqld.log
登录mysql(此时mysql不能进行任何操作,因为需要修改默认密码)
mysql -uroot -p
原因是因为MySQL有密码设置的规范,具体是与validate_password_policy的值有关:
修改密码
set password=password('KtmMGR.123');
查看密码规则
SHOW VARIABLES LIKE 'validate_password%';
修改密码规则
set global validate_password_policy=0;
set global validate_password_length=1;
如果需要可视化连接数据库,可新增账号(暂未运行此语句)
grant all on *.* to root@'%' identified by '[email protected]';
flush privileges;
但此时还有一个问题,就是因为安装了Yum Repository,以后每次yum操作都会自动更新,需要把这个卸载掉:
yum -y remove mysql57-community-release-el7-10.noarch.rpm
51服务器
修改mysql配置
vim /etc/my.cnf
添加如下内容
server_id=51 #三台主机的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
#指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
loose-group_replication_group_name="8053c671-0622-11e8-a300-525400b9c5e8"
#表示将加入或者创建的复制组命名为8053c671-0622-11e8-a300-525400b9c5e8,可以自己指定
loose-group_replication_start_on_boot=off
#设置为Server启动时不自动启动组复制
loose-group_replication_local_address= "192.168.52.150:33061"
#绑定本地的192.168.10.1以及25901端口接受其他组成员的连接,IP地址必须为其他组成员可正常访问
loose-group_replication_group_seeds="192.168.52.150:33061,192.168.52.151:33061,192.168.52.152:33061"
#本行为告诉服务器当服务器加入组时,应当连接到192.168.52.150:33061,192.168.52.151:33061,192.168.52.152:33061这些种子服务器进行配置。本设置可以不是全部的组成员服务地址
loose-group_replication_bootstrap_group= off #配置是否自动引导组
loose-group_replication_single_primary_mode=FALSE
#设置组自动选择一个 server 来处理读/写工作。 这个 server 是主(PRIMARY),所有其他的都是从
loose-group_replication_enforce_update_everywhere_checks=FALSE
#多主模式下为多主更新启用或禁用严格一致性检查。
loose-group_replication_ip_whitelist="192.168.10.0/24"
#开启白名单,认情况下只允许白名单连接到复制组,如果是其他IP则需要配置。
#group_replication_member_weight=80
#值最高的成员被选为新的主节点,值相同的情况下,group根据数据字典中 server_uuid排序,排序在最前的被选择为主节点
loose-group_replication_unreachable_majority_timeout=5
#少数组成员由于网络中断且无法连接到多数成员的成员在离开组之前等待多长时间参数
#group_replication_compression_threshold=131072
#复制压缩,当单个事务产生的binlog数据量大于设置的阈值GRP会启用压缩功能,在网络IO存在瓶颈时能有效减少网络占用30%-40%,但是对CPU消耗也会增加,该功能根据实际情况判定是否使用,默认该功能是超过1M的数据量就启用压缩,关闭只需设置该参数为0
#group_replication_transaction_size_limit=20971520
#指定允许的事务大小,防止过大事务导致组同步失败,这个值允许设置的最大值为2147483647,2G,好像大于max_allowed_packet的1G,最好设置成小于1G,直接避免超过1G事务导致其他复制失败的情况。
#loose-group_replication_bootstrap_group= off
#group_replication_allow_local_disjoint_gtids_join= OFF
生产实例:
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
server_id=150 #三台主机的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="8053c671-0622-11e8-a300-525400b9c5e8"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "192.168.52.150:33061" #这个写本地IP地址
loose-group_replication_group_seeds="192.168.52.150:33061,192.168.52.151:33061,192.168.52.152:33061"
loose-group_replication_bootstrap_group= off
loose-group_replication_single_primary_mode=FALSE
loose-group_replication_enforce_update_everywhere_checks=FALSE
loose-group_replication_ip_whitelist="192.168.52.0/24"
重启51的mysql
systemctl restart mysqld
mysql -uroot –p
授权用户:
SET SQL_LOG_BIN=0;
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'192.168.52.%' IDENTIFIED BY '[email protected]'; #创建复制用户及密码
flush privileges;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='[email protected]' FOR CHANNEL 'group_replication_recovery';
#这个复制跟普通的change master命令有区别,并不需要指定master是谁,但需要指定通道为’group_replication_recovery’
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
#安装一个group_replicaiton 的plugin
SHOW PLUGINS;
SET GLOBAL group_replication_bootstrap_group=ON;
#此引导应仅由单个 sever 独立完成,该 server 启动组并且只启动一次。 这就是为什么引导配置选项的值不保存在配置文件中的原因。 如果将其保存在配置文件中,则在重新启动时,server 会自动引导具有相同名称的第二个组。 这将导致两个不同的组具有相同的名称
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members; #查看组成员状态
52、53服务器
修改mysql配置
vim /etc/my.cnf
###同上,注意修改IP地址和server-id。###
重启52、53的mysql
systemctl restart mysqld
mysql -u root –p
SET SQL_LOG_BIN=0;
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY '[email protected]';
flush privileges;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='[email protected]' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
show plugins;
set global group_replication_allow_local_disjoint_gtids_join=ON;
START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;
CREATE DATABASE test;
1、安装keepalived、harpoxy
安装keepalived软件做高可用
Yum install keepalived haproxy -y
安装harproxy软件做负载
tar xf haproxy-1.8.14.tar.gz
cd haproxy-1.8.14
make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
cp haproxy /usr/sbin/
vim /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf -p /run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
------------------------------------------------------------------------------------
2、51服务器
[root@m1 conf]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface em1
virtual_router_id 151
priority 100
advert_int 1
unicast_src_ip 192.168.52.150
unicast_peer {
192.168.52.151
}
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.52.160 dev em1 label em1:0
}
}
[root@m1 haproxy]# vim haproxy.cfg
global
maxconn 100000
chroot /usr/local/haproxy
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
daemon
nbproc 4
cpu-map 1 0
cpu-map 2 1
cpu-map 3 2
cpu-map 4 3
pidfile /usr/local/haproxy/run/haproxy.pid
log 127.0.0.1 local3 info
defaults
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth haadmin:123456
[root@m1 conf]# vim mysql.cfg
listen mysql-api-3306
bind 0.0.0.0:33306
mode tcp
server 192.168.52.150 192.168.52.150:3306 check inter 3000 fall 3 rise 5
server 192.168.52.151 192.168.52.151:3306 check inter 3000 fall 3 rise 5
server 192.168.52.152 192.168.52.152:3306 check inter 3000 fall 3 rise 5
3、52服务器
[root@m2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface em1
virtual_router_id 151
priority 90
advert_int 1
unicast_src_ip 192.168.52.151
unicast_peer {
192.168.52.150
}
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.52.160 dev em1 label em1:0
}
[root@m2 ~]# vim /etc/haproxy/haproxy.cfg
global
maxconn 100000
chroot /usr/local/haproxy
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
daemon
nbproc 4
cpu-map 1 0
cpu-map 2 1
cpu-map 3 2
cpu-map 4 3
pidfile /usr/local/haproxy/run/haproxy.pid
log 127.0.0.1 local3 info
defaults
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth haadmin:123456
[root@m2 ~]# vim /etc/haproxy/conf/mysql.cfg
listen mysql-api-3306
bind 0.0.0.0:33306
mode tcp
server 192.168.52.150 192.168.52.150:3306 check inter 3000 fall 3 rise 5
server 192.168.52.151 192.168.52.151:3306 check inter 3000 fall 3 rise 5
server 192.168.52.152 192.168.52.152:3306 check inter 3000 fall 3 rise 5