搭建 MySQL主从复制与读写分离
案例概述 :
在实际环境中 ,如果对数据库的读和写都在同一个数据库服务中操作 ,无论实在安全性、高可用性,
还是高并发等各个方面都是完全不能满足实际需求的 ,因此 ,一般来说都只通过主从复制的方式来同
步数据 ,在通过读写分离来提升数据库的并发负载能力 ,这样的方案来进行部署与实施 。
环境拓补图 :
本案环境 :
主机 | 操作系统 | IP地 址 | 主要软件 |
---|---|---|---|
主服务器 | CentOS 7.3 x86_64 | 192.168.217.130 | NTP |
从服务器1 | CentOS 7.3 x86_64 | 192.168.217.131 | ntpdate |
从服务器2 | CentOS 7.3 x86_64 | 192.168.217.132 | ntpdate |
amoeda | CentOS 7.3 x86_64 | 192.168.217.129 | jdk-6u14-linux-x64.bin amoeba-mysql-binary-2.2.0.tar.gz |
客户端 | CentOS 7.3 x86_64 | 192.168.217.128 | mysql |
案例实施:
配置主服务器 :
-
在主服务器上搭建时间同步服务, 安装NTP :
yum install ntp -y
-
配置 NTP :
vim /etc/ntp.conf #编辑配置文件 添加 server 127.127.217.0 #设置本地是时钟源 fudge 127.127.217.0 stratum 8 #设置时间层级为8(限制在15内) #127.127 ntp时间服务器的保留ip地址,作用是使用本机作为客户端的时间服务器
-
开启服务 :
systemctl start ntpd.service systemctl stop firewalld.service setenforce 0
-
配置 MySQL 配置文件 :
vim /etc/my.cnf #在配置文件添加 [mysqld] server-id = 11 #修改 ID 主从不一样 log-bin=master-bin #开启二进制日志 log-slave-updates=true #开启从服务器同步主服务器二进制日志
-
重启服务, 进入数据库给从服务器授权 :
systemctl restart mysqld.service
mysql -u root -p mysql>GRANT REPLICATION SLAVE ON *.* TO ‘myslave‘@‘192.168.217.%‘ IDENTIFIED BY ‘123456‘; #允许从服务器使用 myslave账户 登录数据库 mysql> FLUSH PRIVILEGES; #刷新权限 mysql> show master status; #查看主服务器状态 +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | master-bin.000001 | 604 | | | | +-------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
记住主服务器的二进制日志文件名和偏移量 。
配置从服务器 :
-
安装 ntpdate 同步时间 :
yum install ntpdate -y #从服务器上安装的 [[email protected] ~]# systemctl start ntpdate.service #开启服务 [[email protected] ~]# /usr/sbin/ntpdate 192.168.217.130 #时间同步 6 Jul 09:45:44 ntpdate[2941]: adjust time server 192.168.217.130 offset -0.233224 sec #同步成功 systemctl stop firewalld.service setenforce 0
-
配置MySQL配置文件 :
vim /etc/my.cnf [mysqld] server-id = 12 # id 不一样 别一台从服务器同样配置 id 不同即可 relay-log=relay-log-bin #开启中继日志 relay-log-index=slvae-relay-bin.index #指定位置和名称
-
重启服务 ,进入mysql :
systemctl restart mysqld.service
mysql -u root -p mysql> change master to master_host=‘192.168.217.130‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master-bin.000001‘,master_log_pos=604; # 主服务器地址、授权用户、二进制日志名称、偏移量 。 mysql> start slave; # 开启从服务器 mysql> show slave status\G; #查看从服务器状态 *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.217.130 Master_User: myslave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000001 Read_Master_Log_Pos: 604 Relay_Log_File: relay-log-bin.000002 Relay_Log_Pos: 321 Relay_Master_Log_File: master-bin.000001 Slave_IO_Running: Yes # 两个为yes 表示同步中 Slave_SQL_Running: Yes
配置 Amoeda 代理服务器 :
-
配置 java 环境变量 :
cp jdk-6u14-linux-x64.bin /usr/local/ cd /usr/local/ ./jdk-6u14-linux-x64.bin #运行jdk #之后输入yes 或者 按回车键即可 mv jdk1.6.0_14/ /usr/local/jdk1.6 #重命名
vi /etc/profile # 添加 export JAVA_HOME=/usr/local/jdk1.6 #java家目录 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib #指定运行库 export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin #识别java命令 export AMOEBA_HOME=/usr/local/amoeba #指定amoeba家目录 export PATH=$PATH:$AMOEBA_HOME/bin # amoeba命令
source /etc/profile #刷新环境变量
-
配置 amoeba 软件 :
mkdir /usr/local/amoeba tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ chmod -R 755 /usr/local/amoeba/ /usr/local/amoeba/bin/amoeba amoeba start|stop #出现 amoeba start|stop 说明 amoeba 安装成功
-
配置 amoeba 读写分离 :
mysql> grant all on *.* to ‘test‘@‘192.168.217.%‘ identified by ‘abcabc‘; #在三台mysql上添加权限开放给amoeba访问
cd /usr/local/amoeba vim conf/amoeba.xml #编辑 amoeba 配置文件
30<property name="user">amoeba</property> #第30、32行 用户名 密码 这是客户端访问 amoeba 所需要的账户密码 31 32 <property name="password">123456</property>
# 把注释去掉 开启服务 115<property name="defaultPool">master</property> #修改 默认池 116<property name="writePool">master</property> #修改 写入池 写操作写 mysql 主服务器 117<property name="readPool">slaver</property> #修改 读入池 读操作读 mysql 从服务器
-
配置 dbServers.xml 配置文件 :
vim conf/dbServers.xml 23 <property name="schema">test</property> #把这句话注释 或者在mysql主服务器创建一个test数据库 ,再或者把test修改成mysql主服务器已经存在的数据库名 25 <property name="user">test</property> #允许amoeba 访问数据库 的账户密码 26 # 把注释去掉 开启服务 27 <property name="password">abcabc</property>
42 <dbServer name="master" parent="abstractServer"> #修改 MySQL 主服务器名称 43 <factoryConfig> 44 <!-- mysql ip --> 45 <property name="ipAddress">192.168.217.130</property> #修改 主服务器 IP 地址 49 <dbServer name="slave1" parent="abstractServer"> #修改 MySQL 从服务器名称 50 <factoryConfig> 51 <!-- mysql ip --> 52 <property name="ipAddress">192.168.217.131</property> #修改 从服务器 IP 地址 53 </factoryConfig> 54 </dbServer> 55 #添加 slave2 56 <dbServer name="slave2" parent="abstractServer"> #MySQL 从服务器名称 57 <factoryConfig> 58 <!-- mysql ip --> 59 <property name="ipAddress">192.168.217.132</property> # 从服务器 IP 地址 60 </factoryConfig> 61 </dbServer> 62 <dbServer name="slaves" virtual="true"> #定义 slaves 池 63 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> 64 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--> 65 <property name="loadbalance">1</property> 66 67 <!-- Separated by commas,such as: server1,server2,server1 --> 68 <property name="poolNames">slave1,slave2</property> #修改 slaves 池 所包含slave1 、slave2 69 </poolConfig>
-
启动 amoeba 服务 :
/usr/local/amoeba/bin/amoeba start & #后台启动 netstat -anpt | grep java #查看8066端口 systemctl stop firewalld.service setenforce 0
配置客户端 :
-
在客户端安装 mysql :
yum install -y mysql mysql -u amoeba -p123456 -h 192.168.217.129 -P8066 #链接 amoeba 代理服务 ip地址是 amoeba 地址
读写分离测试 :
-
在客户端创建一个表 ,查看主从服务器是否创建 。
-
在一台mysql从服务器表内插入信息 ,在客户端进行查看到的信息应该是一下有信息 、一下没有信息 。因为在读取mysql从服务器是轮流读取 。
ps:数据库授权给 amoeba 访问的权限账户 、密码和 amoeba 给客户端授予的权限账户 、密码不要搞错 。
原文地址:http://blog.51cto.com/13640803/2139918
时间: 2024-10-13 03:13:09