Lamp架构——mysql集群及组复制
Posted 多于少的区别
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lamp架构——mysql集群及组复制相关的知识,希望对你有一定的参考价值。
mysql集群多主组复制
一、介绍及环境搭建
msql组复制,实施简单,但要求较高,同步采用的是分布式文件系统协议,比半同步更严谨更慢,是一种全同步方案,mysql分布式集群(京东在用),当前最多支持九个节点。
组复制要求较高,而且与之前架构配置不同,所以设置一个干净的实验环境。
关闭所有节点mysql进程
1.单主组复制与多主组复制相关介绍
单主模式适合大于写的场景,因为只有master可以写。
多主模式的每个节点不但可读可写,也都可以同步。
下边实验做的是多主组复制,也就是每个节点都可以写入,其他原理与上面相同,相关介绍见下
mysql多主复制与单主复制相关介绍
1.节点1server5组复制配置
清空节点server5的数据库目录
修改配置文件并初始化
配置 group_replication_bootstrap_group 指示插件是否引导组。 在这种情况下,即使 s1 是组的第一个成员,我们也会在选项文件中将此变量设置为 off。 相反,我们在实例运行时配置 group_replication_bootstrap_group,以确保只有一个成员实际引导该组。
配置 group_replication_group_name 告诉插件它正在加入或创建的组被命名为“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa”。group_replication_group_name 的值必须是有效的 UUID。 在为二进制日志中的组复制事件设置 GTID 时,内部使用此 UUID。 可以使用 SELECT UUID() 来生成 UUID。
组复制默认是单主模式,所以需要关闭单主模式
33061是组复制监听端口
组复制校验特别严谨,要求必须是一致的,slave端有多余的日志时,也会报错。
初始化数据库,启动数据库,并修改密码
[root@server5 mysql]# mysqld --initialize --user=mysql
[root@server5 mysql]# /etc/init.d/mysqld start
[root@server5 mysql]# mysql -p
使用命令行修改数据库登陆密码
mysql> alter user root@localhost identified by 'westos';
禁止记录二进制日志,创建组复制用户,并赋予权限,再开启二进制日志记录,设置组复制
mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.04 sec)
mysql> show plugins;
配置用户后,使用 CHANGE MASTER TO 语句将服务器配置为在下次需要从另一个成员恢复其状态时使用 group_replication_recovery 复制通道的给定凭据。 发出以下命令,将 rpl_user 和 password 替换为创建用户时使用的值。分布式恢复是加入组且与组成员不具有相同事务集的服务器所采取的第一步。 如果未为 group_replication_recovery 复制通道和 rpl_user 正确设置这些凭据,如图所示,服务器将无法连接到捐赠者成员并运行分布式恢复过程以获得与其他组成员的同步,因此最终无法加入该组。
首次启动组的过程称为引导,需要使用 group_replication_bootstrap_group 系统变量来引导组。 引导只能由单个服务器完成,即启动组的服务器并且只执行一次。 这就是为什么 group_replication_bootstrap_group 选项的值没有存储在实例的选项文件中的原因。 如果它保存在选项文件中,则在重新启动服务器时会自动引导第二个具有相同名称的组。 这将导致两个不同的组具有相同的名称。
第一条指令只在第一个启动节点上运行
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
查看组以及组成员
mysql> SELECT * FROM performance_schema.replication_group_members;
2.节点2server6配置
清空数据库目录
[root@server6 mysql]# pwd
/data/mysql
[root@server6 mysql]# rm -fr *
编辑配置文件/etc/my.cnf
[root@server6 mysql]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id=2
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
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "172.25.254.16:33061"
group_replication_group_seeds= "172.25.254.15:33061,172.25.254.16:33061,172.25.254.17:33061"
group_replication_bootstrap_group=off
group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8"
group_replication_single_primary_mode=OFF
group_replication_enforce_update_everywhere_checks=ON
初始化数据库,并启动数据库,修改管理员密码
关闭记录二进制日志,创建用户并赋予复制权限,创建完成后,正常开启二进制日志的记录
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
配置组复制,查看安装插件
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
mysql> show plugins;
启动组复制
因为server5已经是该组复制的引导节点,所以不需要再执行引导再指令,直接启动组复制即可自动加进去。
查找启动失败原因,查看日志
修改配置文件
[root@server6 mysql]# vim /etc/my.cnf
group_replication_allow_local_disjoint_gtids_join=1
参数为1或ON都是开启的意思
在配置文件修改参数是需要重启生效的,也可用set_global命令热生效
启动组复制
mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
节点一:server5查看组成员
3.节点3server7配置
清空数据目录
修改配置文件/etc/my.cnf
[root@server7 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id=3
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
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "172.25.254.17:33061"
group_replication_group_seeds= "172.25.254.15:33061,172.25.254.16:33061,172.25.254.17:33061"
group_replication_bootstrap_group=off
group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8"
group_replication_single_primary_mode=OFF
group_replication_enforce_update_everywhere_checks=ON
group_replication_allow_local_disjoint_gtids_join=1
~
初始化并修改管理员密码
关闭二进制日志记录,创建组复制用户并赋予权限
配置组复制,并启动
节点1(server5)查看组复制成员
三个节点的状态一定是online的,如果不是就是报错。现在三个节点都是主,也就是多主模式,当前组允许down一个节点。
二、测试
激活组复制后,对数据库是有要求的,innodb引擎创建表结构需要主键。
节点1插入表数据
mysql> CREATE DATABASE test;
mysql> use test;
mysql> desc t1;
mysql> INSERT INTO t1 VALUES (1, 'Luis');
查看节点2和节点3
在节点二,往t1表插入数据,保证主键的值唯一
查看另外两个节点数据是否同步
在节点三上,往t1表插入数据,保证主键的值唯一
查看另外两个节点的数据是否同步
以上设置的mysql组复制其实就是mysql的分布式集群
数据库在企业的地位很高,企业的数据库就是企业的灵魂,现在数据不仅在mysql数据库,还有newsql,比如tidb就是一种。分布式数据库才能真正解决瓶颈,自带高可用、负载均衡。分布式主要问题就是解决单体的限制,分而治之,打破了单体的性能瓶颈,无论是硬件还是软件,单机都是有性能上限的,分布式可以通过水平扩容节点达到整体性能的提升。传统mysql主从还是有用的,包括组复制还是基于mysql主从,还是基于二进制日志,只不过校验逻辑边的更复杂。
上述多主组复制架构会出现一个问题,虽然每个节点都可以写入,且同步到不同节点,但每个节点只能删除该结点写入的数据否则会报错
基于LAMP架构实现web网站高可用集群
1.安装7台主机,配置主机名网络,关闭防火墙和selinux
2.两台nginx主机,配置网络源安装Nginx 和 keeplived(热备)
3.两台apache主机,配置本地源安装,httpd和php php-mysql
4.两台mysql主机,配置raid5,创建目录并挂载到/var/lib/mysql 再安装mariadb*
5.一台nfs主机,配置raid5,创建并挂载到/luntan目录中,安装nfs-utils*,配置软件
(可省略) /打开网卡配置文件
Vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改参数
BOOTPROTO=static
ONBOOT=yes
IPADDR=IP地址
NETMASK=对应子网掩码
GATEWAY=对应网关
注:如果是在vmware虚拟机上配置静态IP,如果主机网络类型是仅主机模式或者NAT模式请注意查看虚拟网络编辑器中对应网段与网关。
原因:当前的虚拟网络编辑器就是我们的模拟路由器,所以网段必须统一。
NFS
安装mdadm: yum install -y mdadm
创建raid5: mdadm -C /dev/md5 -l 5 -n 3 -x 1 /dev/sdb,c,d,e
格式化: mkfs -t ext4 /dev/md5
挂载: mount /dev/md5 /luntan
安装软件: yum install -y nfs-utils*
安装NFS yum install -y install nfs
关闭防火墙, systemctl stop firewalld
selinux setenforce 0
先启动守护进程 systemctl start rpcbind
再启动运行程序 systemctl start nfs
更换到/目录 cd /
创建创建共享目录/luntan mkdir /luntan
更换目录 /luntan cd /luntan
上传需要被共享的文件到这个目录中去
wget http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_UTF8.zip
修改配置文件:vi /etc/exports
文件内容:共享目录的绝对路径 客户端(权限)
例如: /luntan *(rw,no_root_squash)
4.切换到客户端主机上进行挂载挂载共享目录到指定挂载点:
mount -t 文件系统类型 服务端IP:共享目录绝对路径本机挂点
例如: mount -t nfs 服务端 IP:/luntan /var/www/html
常见错误:
(1)提示文件系统类型不存在。解决方式:yum install -y nfs*
(2)提示挂载点目录路径或共享目录不存在错误。解决方式:确认本机挂载点正确,确认共享目录路径书写正确。
(3)提示Norouteto host。解决方式:关闭客户端服务器的防火墙和selinux
(4)提示拒绝被挂载。解决方式:服务端使用命令 exportfs +直看配置文件语法是否有误。
5.验证挂载成功
Showmount -e 本机IP地址
Apache
配置yum源 复制yum 在NFS上输入 scp /本地文件路径 root@目标主机IP:目标路径
安装NFS yum install -y nfs*
安装httpd* yum install -y httpd*
安装php* yum install -y php*
4.切换到客户端主机上进行挂载挂载共享目录到指定挂载点:
mount -t 文件系统类型 服务端IP:共享目录绝对路径本机挂点
例如: mount -t nfs 服务端IP:/luntan /var/www/html
常见错误:
(1)提示文件系统类型不存在。解决方式:yum install -y nfs*
(2)提示挂载点目录路径或共享目录不存在错误。解决方式:确认本机挂载点正确,确认共享目录路径书写正确。
(3)提示Norouteto host。解决方式:关闭客户端服务器的防火墙和selinux
(4)提示拒绝被挂载。解决方式:服务端使用命令 exportfs +直看配置文件语法是否有误。
5.验证挂载成功
Showmount -e 本机IP地址
下载wget 安装 wget http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_UTF8.zip
安装unzip*: yum install -y unzip*
切换目录: cd /var/www/html
解压: unzip D......[将NFS里面下载的Dis.......解 压到httpd里面
Unzip Discuz_X3.2_SC_UTF8\\(1\\).zip -d /var/www/html/
移动: mv /var/www/html/upload/* /var/www/html
修改权限: chmod -R 757 data config uc*
关闭防火墙: systemctl stop firewalld
关闭selinux: setenforce 0
重新启动httpd; systemctl restart httpd
MySQL【配置数据库开启远程服务】
下载mdadm:yum install -y mdadm
创建raid5: mdadm -C /dev/md5 -l 5 -n 3 -x 1 /dev/sdb,c,d,e
格式化: mkfs -t ext4 /dev/md5
创建挂载点: mkdir /var/lib/md5
挂载: mount /dev/md5 /var/lib/mysql/
配置yum源 复制yum 在NFS上输入 scp /本地文件路径 root@目标主机IP;目标路径
配置数据库开启远程管理
1.安装数据库 yum install -y mariadb*
2.启动数据库 systemctl start mariadb
3.配置密码 mysql_secure_installation
4.本机登录验证 mysql -uroot -p
5.授权 grant all privileges on *.* to 'root'@'%' identified by '123456';
6. 刷新权限 flush privileges;
7.退出 quit
8.关闭主机防火墙 systemctl stop firewalld
9.关闭主机selinux setenfroce 0
MySQL主从复制
2. 主从复制配置过程
2.2.1 主库配置
# vim /etc/my.cnf
[mysqld]
....
log-bin=mysql-bin #日志文件名称mysql-bin.00001
server-id=1 #0--65535范围
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=1
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
# 修改完成之后需要重启Mysql服务
systemctl restart mariadb
# 授权远程用户
mysql> CREATE USER 'shz'@'%' IDENTIFIED BY '123456';
mysql>grant all privileges on *.* to 'shz'@'%' identified by '123456';
mysql> flush privileges;
#验证成功,切换到从机
mysql -h主机IP -ushz -p123456
登录成功证明主库用户授权成功,网络互通,防火墙selinux关闭生效
2.从库配置
# vim /etc/my.cnf
[mysqld]
...
server-id=3
relay-log=mysql-relay-bin
replicate-ignore-db=mysql
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
replicate-ignore-db=sys
重启服务 systemctl restart mariadb
2.2.3 在主库上导出所有数据库
#在主机与从机上创建master1数据库
MASTER > create database master1;
SLAVE > create database master1;
# 获取库信息
MASTER> show master status; 查询Log_file log_pos
#配置从库连接到主库,MASTER_LOG_FILE与MASTER_LOG_POS的值由主库信息获得
mysql> CHANGE MASTER TO MASTER_HOST='192.168.122.148', MASTER_USER='shz', MASTER_PASSWORD='123456', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=670, MASTER_CONNECT_RETRY=10;
#开启复制
start slave;
#查看slave状态
show slave status \\G;
#主要查看内容:
Slave_IO_Running,Slave_SQL_Running的状态要为Yes。
nginx
基于NGINX完成的负载均衡
- 配置yum源
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
2.修改/etc/resolv.conf
nameserver 网关
wget http://mirrors.aliyun.com/repo/Centos-7.repo
- 安装nginx
yum install -y nginx
- 启动
systemctl start nginx
注:nginx使用tcp80端口,请注意与其他web服务冲突、
- 配置反向代理的主机是谁
vi /etc/nginx/nginx.conf
http
...
upstream backend
server 192.168.100.102:80; apache1主机IP
server 192.168.100.103:80; apache2主机IP
- 配置Nginx开启反向代理访问
/etc/nginx/conf.d/default.conf
server
...
location /
proxy_pass http://backend;
proxy_redirect default;
#设置代理
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
在两个NGINX主机上安装keepalived
Yum -y install keepalived
修改配置/etc/keepalived/keepalived.conf
清空内容后,添加以下内容
global_defs
router_id 1
vrrp_instance VI_1
state MASTER
interface ens33
virtual_router_id 1
priority 100
advert_int 1
authentication
auth_type PASS
auth_pass 123456
virtual_ipaddress
192.168.150.200
辅调度器上要稍作修改:
将 router_id 1 改为 router_id 2
将 state MASTER 改为 state BACKUP
将 priority 100 改为 priority 99
其他不变
以上是关于Lamp架构——mysql集群及组复制的主要内容,如果未能解决你的问题,请参考以下文章