mysql主从复制与读写分离
在实际生产环境中,数据库读写都在同一个数据库服务中操作,无论在安全性、高可用性,还是高并发都是完全不能满足实际需求的,因此需要主从复制的方式来同步数据,在通过读写分离来提升负载能力的方案来进行。
mster开启二进制允许
从进行同步从开启二进制模式找谁同步
IO故障:授权,网络
读写分离原理
只在主服务器上写,只在从服务器上读
主数据库处理事务性查询,从数据库处理select查询
数据库复制用于将事务性查询变更同步到集群中的从数据库
读写分离方案:基于程序代码内部实现
基于中间代理层实现
mysql-proxy
amoeba
有三个账号需要创建并给权限的。
实验拓扑图
首先需要设置时间同步,不然会出问题
同步阿里云时间,时间同步协议ntp开放123端口
[root@localhost ~]# ntpdate ntp.aliyun.com
首先配置主服务器
server-id = 11 ##服务器的id不能相同修改id
log-bin = master-bin ##主服务器开启二进制文件日志名字叫master-bin
log-slave-updates = true ##从服务器允许更新二进制文件日志
wq保存退出
刷新mysqld服务
[root@localhost mysql]# systemctl restart mysqld
检查二进制文件是否开启
[root@localhost mysql]# ls /usr/local/mysql/data/
master-bin.000001 ##有了这个就是开启了二进制文件
之后去开放权限,没用这个用户会自动产生,有了就是赋予权限
进入数据库 mysql -uroot -p
mysql> grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by '123456';
##开启同步允许所有数据库表用过myslave准许的那个网段密码进行
Query OK, 0 rows affected, 1 warning (0.00 sec)
刷新
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
查看定位pos ##之后需要用到
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 599 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
主服务器就设置完成了。
设置从服务器
修改mysql配置文件
vi /etc/my.cnf
server-id = 22 ##修改id号
relay-log = relay-log-bin ##开启中继日志
relay-log-index = slave-relay-bin.index ##定义位置并设置索引
wq保存刷新
[root@localhost mysql]# systemctl restart mysqld
进入数据库mysql -uroot -p
mysql> change master to master_host='20.0.0.25',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=599;
## 设置主服务器地址,使用的用户,用户密码,指定的二进制文件名,主服务器pos值
Query OK, 0 rows affected, 2 warnings (0.01 sec)
开启功能
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
查看是否启动线程
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
两个yes就表示开启了线程。
另一台从服务器配置相同,id不同就行。
接下来设置amoeba服务器
先把jdk压缩包拖入,解压
[root@localhost opt]# tar xzvf jdk-8u144-linux-x64.tar.gz
[root@localhost opt]# cp -rv jdk1.8.0_144/ /usr/local/java
之后修改profile配置文件
vi /etc/profile
export JAVA_HOME=/usr/local/java ##调用类库,要依赖于java
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib ##指定环境变量bin能被识别
export AMOEBA_HOME=/usr/local/amoeba ##amoeba工作目录
export PATH=$PATH:$AMOEBA_HOME/bin ##便于amoeba命令被识别
wq保存然后刷新环境变量
[root@localhost opt]# source /etc/profile
[root@localhost opt]# echo $PATH
查看里面有了amoeba和mysqlbin就完成了
/usr/local/mysql/bin:/usr/local/mysql/lib:/usr/local/mysql/bin:/usr/local/mysql/lib:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/amoeba/bin
然后将amoeba压缩包拉入opt下
解压amoeba并将文件拉入usr/local下的amoeba,并给755权限
[root@localhost opt]# unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/
[root@localhost opt]# mv /usr/local/amoeba-mysql-3.0.5-RC/ /usr/local/amoeba
[root@localhost opt]# chmod -R 755 /usr/local/amoeba/
修改32行
[root@localhost opt]# vi /usr/local/amoeba/amoeba-mysql-3.0.5-RC/jvm.properties
JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k"
wq保存
制作amoeba管理脚本
[root@localhost opt]# vi /etc/init.d/amoeba
#!/bin/bash
#chkconfig: 35 62 62
#
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
NAME=Amoeba
AMOEBA_BIN=/usr/local/amoeba/amoeba-mysql-3.0.5-RC/bin/launcher
SHUTDOWN_BIN=/usr/local/amoeba/amoeba-mysql-3.0.5-RC/bin/shutdown
PIDFILE=/usr/local/amoeba/amoeba-mysql-3.0.5-RC/Amoeba-MySQL.pid
SCRIPTNAME=/etc/init.d/amoeba
case "$1" in
start)
echo -n "Starting $NAME... "
$AMOEBA_BIN
echo " done"
;;
stop)
echo -n "Stoping $NAME... "
$SHUTDOWN_BIN
echo " done"
;;
restart)
$SHUTDOWN_BIN
sleep 1
$AMOEBA_BIN
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart}"
exit 1
;;
esac
wq保存,给脚本权限
[root@localhost opt]# chmod +x /etc/init.d/amoeba
[root@localhost opt]# chkconfig --add amoeba
重启amoeba
[root@localhost opt]# service amoeba start
查看开没开启8066端口
[root@localhost bin]# netstat -anpt | grep 8066
tcp6 0 0 :::8066 :::* LISTEN 98518/java
然后在三台主从服务器上开放端口
[root@localhost ~]# mysql -u root -p
5.7没test数据库需要创建
mysql> create database test;
Query OK, 1 row affected (0.01 sec)
mysql> grant all on *.* TO test@'20.0.0.%' IDENTIFIED BY '123456';
刷新后退出
mysql> FLUSH PRIVILEGES;
回到amoeba服务器
[root@localhost conf]# cd /usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/
因为java开发文件都是xml,需要加载标签
[root@localhost conf]# vi amoeba.xml
---28行-----设置客户端连接amoeba前端服务器时使用的用户名和密码----
<property name="user">amoeba</property>
----30行---------
<property name="password">123456</property>
83-去掉注释-同时把默认的server1改成master,把默认的servers改成 slaves
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slaves</property>
wq保存退出
编辑db文件
[root@localhost conf]# vi dbServers.xml
-26-29--去掉注释--
<property name="user">test</property>
<property name="password">123456</property>
------主服务器地址---
43 <dbServer name="master" parent="abstractServer">
46 <property name="ipAddress">20.0.0.25</property>
--50-从服务器主机名-
<dbServer name="slave1" parent="abstractServer">
--53-从服务器地址-
<property name="ipAddress">20.0.0.26</property>
还有一台复制粘贴改为28
shift+G到结尾
<dbServer name="slaves" virtual="true"> #####name后面改成 slaves
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">slave1,slave2</property> #####poolNames后面改成 slave1,slave2
</poolConfig>
</dbServer>
wq保存退出
刷新amoeba
service amoeba restart
mysql -u amoeba -p123456 -h 127.0.0.1 -P8066 ### 登录 amoeba服务端
Enter password: