数据库高可用方案(3):Mysql-MMM+读写分离

1、mysql主主+主从+读写分离

1)主主+主从的作用
保证mysql数据库的可靠性
避免单点故障、防止数据丢失
2)读写分离的作用
增强网络的流量
区分读取流量和写入流量
3)缺点
从只能去一台主节点复制数据
当从数据库同步的主节点故障、从节点无法复制数据

2、mysql-mmm高可用的优势和配置文件

1)优势
配置mysql主服务器节点的高可用
避免主服务器主线单点故障
对两台主节点配置高可用,用户访问vip地址写入数据
2)配置文件
mmm_common.conf:主配置文件,数据库端和监控端都需要配置
mmm_agent.conf:监控端连接数据库使用,在所有的数据库端配置
mmm_mon.conf:监控配置文件,只在监控端配置
如图所示:
在这里插入图片描述

3、安装配置ntp服务

1)安装ntp服务
[root@master01 /]# yum -y install ntp (四台同时安装)
2)配置ntp服务
[root@master01 /]# systemctl restart ntpd
[root@master01 /]# systemctl enable ntpd
restrict 192.168.200.0 mask 255.255.255.0 nomodify notrap
server 127.127.1.0
fudge 127.127.1.0 stratum 8
[root@master02 ~]# ntpdate 192.168.200.10 将四台服务器的时间都同步了

4、修改主配置文件并重启

vim /etc/my.cnf
1)master01
[mysqld]
server-id = 10 数据库的ID号
log-bin = mysql-bin 开启二进制日志功能
log-slave-updates = true 允许从服务器更新数据
relay-log = relay-log-bin 数据库事件的单独编号文件
relay-log-index = relay-log-bin.index 记录relay-log-bin日志位置
2)master02
[mysqld]
server-id = 20
log-bin = mysql-bin
log-slave-updates = true
relay-log = relay-log-bin
relay-log-index = relay-log-bin.index
3)slave01
[mysqld]
server-id = 30
log-bin = mysql-bin
relay-log = relay-log-bin
relay-log-index = relay-log-bin.index
4)slave02
[mysqld]
server-id = 40
log-bin = mysql-bin
relay-log = relay-log-bin
relay-log-index = relay-log-bin.index
5)分别启动这四台mysql服务器
[root@master01 /]# systemctl restart mysqld
6)数据库中的数据不一致时的操作(基本上以数据最多的为主,在其他数据库中导入这台数据库的所有数据)
mysql> flush tables with read lock; 施加锁,在数据多的一台上配置
mysqldump -uroot -p --opt --all-databases > /root/all-databases.sql 最好另起一个ssh终端,输入此命令,防止锁失效
scp /root/all-databases.sql root@192.168.200.20:/root/ 将数据传输到其他节点上
mysql -uroot -p < /root/all-databases.sql 将传输过来的数据导入数据库中
mysql -uroot -ppwd@123 -e “flush privileges;” 在其他节点上刷新配置
mysql> unlock tables; 若是正在使用的环境中最好是配置完主主或主从复制后在解锁
5、配置主主复制和主从复制
1)主主复制
[root@master01 /]# mysql -uroot -ppwd@123

mysql> grant replication slave on *.* to 'tongbu'@'192.168.200.%' identified by 'pwd@123';	授权所有服务器复制master01二进制日志的权限
			mysql> show master status;			查看master01的日志状态
			mysql> change master to master_host='192.168.200.10',master_user='tongbu',master_password='pwd@123',master_log_file='mysql-bin.000001',master_log_pos=411;				在master02中配置
			mysql> statr slave;					启动master02的slave
		[root@master02 /]# mysql -uroot -ppwd@123
			mysql> grant replication slave on *.* to 'tongbu'@'192.168.200.%' identified by 'pwd@123';	授权所有服务器复制master02二进制日志的权限
			mysql> show master status;			查看master02的日志状态
			mysql> change master to master_host='192.168.200.20',master_user='tongbu',master_password='pwd@123',master_log_file='mysql-bin.000001',master_log_pos=411;	在master01中配置
			mysql> statr slave;					启动master01的slave

2)主从复制

		[root@slave01 /]# mysql -uroot -ppwd@123
mysql> change master to master_host='192.168.200.10',master_user='tongbu',master_password='pwd@123',master_log_file='mysql-bin.000001',master_log_pos=411;	Slave01中配置
			mysql> statr slave;	启动slave01的slave
		[root@slave02 /]# mysql -uroot -ppwd@123
			mysql> change master to master_host='192.168.200.10',master_user='tongbu',master_password='pwd@123',master_log_file='mysql-bin.000001',master_log_pos=411;	Slave02中配置
			mysql> statr slave;	启动slave02的slave

3)若出现配置错误需要使用如下命令后在重新配置:
mysql> stop slave; 停止服务
mysql> reset slave; 重置服务
4)检查四台数据库的状态(ip地址,Slave_IO_Running: Yes,Slave_SQL_Running: Yes)
在这里插入图片描述
6、安装配置mysql-mmm
1)安装mysql-mmm(五台都需要安装)
[root@master01 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@master01 ~]# yum -y install epel-release mysql-mmm*
2)修改hosts文件(五台都要配置,内容相同)
[root@master01 /]# vim /etc/hosts
192.168.200.10 master01
192.168.200.20 master02
192.168.200.30 slave01
192.168.200.40 slave02
192.168.200.50 monitor
3)配置mysql-mmm(五台上的配置相同)
[root@master01 /]# vim /etc/mysql-mmm/mmm_common.conf

active_master_role      writer
			<host default>
			    cluster_interface       ens32	服务器监听的网卡
			    pid_path                /run/mysql-mmm-agent.pid	代理运行的pid
			    bin_path                /usr/libexec/mysql-mmm/	mmm可执行文件的路径
			    replication_user        tongbu	主主和主从复制授权的账户
			    replication_password    pwd@123	授权的密码
			    agent_user              mmm_agent	对其他其他数据库访问本数据库的授权
			    agent_password          pwd@123	授权的密码
			</host>
			<host master01>	Mysql的主机名
			    ip      192.168. 200.10	Master01的IP地址
			    mode    master	角色属性,master代表主
			    peer    master02	对等的数据库的host名
			</host>	
			<host master02>
			    ip      192.168.200.20
			    mode    master
			    peer    master01
			</host>
			<host slave01>
			    ip      192.168.200.30
			    mode    slave
			</host>
			<host slave02>
			    ip      192.168.200.40
			    mode    slave
			</host>
			<role writer>	角色配置,写入角色
			    hosts   master01,master02	写入的主机名
			    ips     192.168.200.15	vip地址
			    mode    exclusive	只允许提供一个主的ip地址,便于地址飘移
			</role>
			<role reader>	角色配置,读取角色
			    hosts   slave01,slave02	读取的主机名
			    ips     192.168.200.35,192.168.200.45	vip地址
			    mode    balanced	负载均衡
			</role>

4)在mysql服务器上配置客户端代理(所有的mysql数据库中)
master01:
[root@master01 /]# vim /etc/mysql-mmm/mmm_agent.conf
this master01
master02:
[root@master02 /]# vim /etc/mysql-mmm/mmm_agent.conf
this master02
slave01:
[root@slave01 ~]# vim /etc/mysql-mmm/mmm_agent.conf
this slave01
slave02:
[root@slave02 ~]# vim /etc/mysql-mmm/mmm_agent.conf
this slave02
[root@master01 /]# systemctl start mysql-mmm-agent.service
[root@master01 /]# systemctl enable mysql-mmm-agent.service
5)配置监控端
[root@monitor ~]# vim /etc/mysql-mmm/mmm_mon.conf

  8     ping_ips            192.168.200.10,192.168.200.20,192.168.200.30,192.168.200.40	需要监控的数据库
  9     auto_set_online     5	
 19 <host default>	
 20     monitor_user        mmm_monitor	监控服务器通过这个账户管理数据库
 21     monitor_password    pwd@123	管理数据库的密码
 22 </host>	

[root@monitor ~]# systemctl start mysql-mmm-monitor.service
[root@monitor ~]# systemctl enable mysql-mmm-monitor.service
6)配置数据库授权
[root@master01 /]# mysql -uroot -ppwd@123 -e ’ grant all on . to “mmm_agent”@“192.168.200.%” identified by “pwd@123”;’ 授权授权所有数据库都可以查看当前信息,用于故障转移后
[root@master01 /]# mysql -uroot -ppwd@123 -e ’ grant all on . to “mmm_monitor”@“192.168.200.50” identified by “pwd@123”;’ 授权监控服务器监控数据库的状态
7)查看mysql的状态
[root@monitor ~]# mmm_control show
在这里插入图片描述

7、配置读写分离

1.安装jdk和amoeba。
1)配置JDK。
[root@amoeba ~]# mkdir /usr/local/jdk
[root@amoeba /]# cp /usr/src/jdk-6u14-linux-x64.bin /usr/local
[root@amoeba local]# ./jdk-6u14-linux-x64.bin
[root@amoeba local]# mv ./jdk1.6.0_14/* ./jdk
2)安装amoeba。
[root@amoeba jdk]# mkdir /usr/local/amoeba
[root@amoeba jdk]# mv /usr/src/conf/* /usr/local/amoeba
3)配置环境变量。
[root@amoeba /]# vim /etc/profile.d/jdk.sh

				export JAVA_HOME=/usr/local/jdk
				export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
				export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
				export AMOEBA_HOME=/usr/local/amoeba
				export PATH=$PATH:$AMOEBA_HOME/bin

[root@amoeba /]# source /etc/profile
[root@amoeba local]# java -version
2.设置amoeba读写分离账户。
1)设置主mysql允许test账户访问mysql,需要在主从上同时配置。
[root@master /]# mysql -uroot -p
mysql> grant all on . to ‘amoeba’@‘192.168.100.60’ identified by ‘pwd@123’;
2)修改amoeba配置文件配置客户端访问amoeba的账户密码。
[root@amoeba /]# vim /usr/local/amoeba/amoeba.xml

 10                         <property name="port">8066</property>	客户端访问amoeba的端口
 30        <property name="user">client</property>	访问amoeba的账户
 32        <property name="password">pwd@123</property>	访问amoeba账户的密码
115                 <property name="defaultPool">master</property>	默认写mysql池的名字
116                 <property name="writePool">master</property>	写入MySQL数据库的池
117                 <property name="readPool">slaves</property>	读取MySQL数据库的池

3)设置amoeba服务器的host文件,添加解析主机名。(在群集中所有的服务器上配置,也可配置DNS,或不配置在后面配置时用ip地址也可以)
[root@amoeba /]# vim /etc/hosts
192.168.100.10 master01
192.168.100.20 master02
192.168.100.30 slave01
192.168.100.40 slave02
192.168.100.50 monitor
192.168.100.60 amoeba
4)修改amoeba的配置文件添加服务器池。
[root@amoeba /]# vim /usr/local/amoeba/dbServers.xml

 26             <property name="user">amoeba</property>
				 27             <property name="password">pwd@123</property>
				 42         <dbServer name="master"  parent="abstractServer">
				 43                 <factoryConfig>
				 44                         <!-- mysql ip -->
				 45                         <property name="ipAddress">192.168.100.15</property>
				 46                 </factoryConfig>
				 47         </dbServer>
				 49         <dbServer name="slave01"  parent="abstractServer">
				 50                 <factoryConfig>
				 51                         <!-- mysql ip -->
				 52                         <property name="ipAddress">192.168.100.35</property>
				 53                 </factoryConfig>
				 54         </dbServer>       
				 56         <dbServer name="slave02"  parent="abstractServer">
				 57                 <factoryConfig>
				 58                         <!-- mysql ip -->
				 59                         <property name="ipAddress">192.168.100.45</property>
				 60                 </factoryConfig>
				 61         </dbServer>
				 64         <dbServer name="slaves" virtual="true">
				 65                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
											<!-- Load balancing strategy: 1=ROUNDROBIN(轮询) , 2=WEIGHTBASED(权重) , 3=HA--> 
				 66                         <property name="loadbalance">1</property>
				 67                         <property name="poolNames">slave01,slave02</property>
				 68                 </poolConfig>
				 69         </dbServer>
				

5)启动amoeba。
[root@amoeba /]# amoeba start&
[root@amoeba /]# netstat -anptu | grep 8066
[root@amoeba /]# netstat -anptu | grep java
6)客户端登录到数据库。
[root@Centos ~]# mysql -u client -p -h 192.168.100.60 -P 8066
在这里插入图片描述
7)测试
当只开启两个从时,使用(select)测试读取数据
当之开启两个主时,使用(create)测试写入数据

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

H . C . Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值