linux Mysql主从复制 Amoeba 读写分离
Mysql 主从复制
主机 A:172.16.9.206 root/[email protected]
从机 B:172.16.9.205 root/[email protected]
1、先登录主机 A,在主服务器上,设置一个从数据库的账户,使用REPLICATION SLAVE(从复制)赋予权限,如: 用户:backup glxx1234
mysql> GRANT REPLICATION SLAVE ON *.* TO 'backup'@'172.16.9.205' IDENTIFIED BY 'glxx1234'
赋予从机权限,有多台从机,就执行多次。
mysql>flush privileges;
2、 打开主机A的my.cnf,输入如下:(修改主数据库的配置文件my.cnf,开启BINLOG,并设置server-id的值,修改之后必须重启mysql服务)
server-id = 1 #主机标示,整数log_bin = mysql-bin #确保此文件可写,开启bin-logread-only =0 #主机,读写都可以binlog-do-db =test #需要备份数据,多个写多行binlog-ignore-db =mysql #不需要备份的数据库,多个写多行可以通过mysql>show variables like 'log_%'; 验证二进制日志是否已经启动。
本地配置
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-bin=mysql-bin
server-id=1
binlog-do-db=sa_fuwuqu
binlog-ignore-db=information_schema
(查询日志启动状态 : show variables like '%bin%')
3、现在可以停止主数据的的更新操作,并生成主数据库的备份,我们可以通过mysqldump到处数据到从数据库,当然了,你也可以直接用cp命令将数据文件复制到从数据库去,注意在导出数据之前先对主数据库进行READ LOCK,以保证数据的一致性
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.19 sec)
然后mysqldump导出数据:
mysqldump -h127.0.0.1 -p3306 -uroot -p test > /data/backup/test.sql
4、得到主服务器当前二进制日志名和偏移量,这个操作的目的是为了在从数据库启动后,从这个点开始进行数据的恢复。
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 154 | test | mysql |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
最好在主数据库备份完毕,恢复写操作。
mysql> unlock tables;
Query OK, 0 rows affected (0.28 sec)
5、将刚才主数据备份的test.sql复制到从数据库(navicat、phpmyadmin、命令行都可以),进行导入。
6、修改从数据库的my.cnf,增加server-id参数,指定复制使用的用户,主数据库服务器的ip,端口以及开始执行复制日志的文件和位置。打开从机B的my.cnf,输入(修改之后必须重启mysql服务)
server-id = 2log_bin = /var/log/mysql/mysql-bin.log
下面是关于主从的参数配置(通过sql语句来实现):master_host =192.168.10.111master_user =backupmaster_pass =123456master_port =3306master_connect_retry=60 #如果从服务器发现主服务器断掉,重新连接的时间差(秒)replicate_do_db =test #只复制某个库replicate_ignore_db=mysql #不复制某个库
change master to master_host='masterIP', master_user='slave', master_password='slvaePASS',master_port =3306,master_connect_retry=60;
7、在从服务器上,启动slave进程
mysql> start slave;
Amoeba 读写分离
需要软件:jdk-8u11-linux-x64.tar.gz amoeba-mysql-binary-2.0.1-BETA.tar.gz
一、配置jdk环境变量
vim /etc/profile
<!--下面是profile 文件环境变量配置 以及amoeba的环境变量配置-->
export AMOEBA_HOME=/home/FuWuQu/amoeba-2.0.1
export PATH=$AMOEBA_HOME/bin/:$PATH
export JAVA_HOME=/usr/java/jdk1.8.0_171
export CLASSPATH=${JAVA_HOME}/lib
export PATH=$JAVA_HOME/bin:$PATH
export PATH=$JAVA_HOME/bin/:$PATH
#更新资源文件
source /etc/profile
二、解压 amoeba-mysql-binary-2.0.1-BETA.tar.gz 到/home/FuWuQu/amoeba-2.0.1
tar -zxvf amoeba-mysql-binary-2.0.1-BETA.tar.gz /home/FuWuQu/amoeba-2.0.1
三、进入 /amoeba-2.0.1/conf
cd /home/FuWuQu/amoeba-2.0.1/conf
vim dbServers.xml
四、设置mysql默认连接时的端口,数据库,帐号和密码
该配置文件里主从数据库的parent是abstractServer,需要从它继承一些信息,所以这里的信息一定要配置正确。
需要修改成类似:
mysql schema这里默认是sa_fuwuqu,需要改成一个存在的数据库。
五、设置连接主从数据库服务器的IP地址和服务器别名,用户名及密码
将
<dbServernamedbServername="server1" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<propertynamepropertyname="ipAddress">127.0.0.1</property>
</factoryConfig>
</dbServer>
替换成类似于:
<dbServernamedbServername="master" parent="abstractServer">
<factoryConfig>
<propertynamepropertyname="ipAddress">192.168.1.60</property>
<propertynamepropertyname="user">root </property>
<propertynamepropertyname="password">dandan </property>
</factoryConfig>
</dbServer>
<dbServernamedbServername="slave1" parent="abstractServer">
<factoryConfig>
<propertynamepropertyname="ipAddress">192.168.1.23</property>
<propertynamepropertyname="user">root </property>
<propertynamepropertyname="password">dandan </property>
</factoryConfig>
</dbServer>
--注意:这里写的数据库用户,密码必须是主从允许远程访问的用户,不是主从的本地用户。
注意:此处测试机 205与206上的mysql 用户名都是root/glxx1234 所以在server1及server2中没有配置用户名及密码。
六、定义读写的池
把master节点加入WritePool,把slave节点加入ReadPool
将
替换为类似于:
七、配置amoeba.xml
vim amoeba.xml
修改proxy的端口号,管理帐号及密码
客户端和程序只需要连接proxy的帐号密码即可,相当于中间接封装。
将
替换为:
这样配置后 链接数据库即可使用 3308端口 用户名 glxx/glxx1234
八、设置默认池及读写分离
一些除了SELECT\UPDATE\INSERT\DELETE的语句都会在defaultPool执行。
我这里将
替换为:
这里记得取消注释writePool和readPool这两行。
--这几行位于文件后面的位置
九、启动amoeba
cd/usr/FuWuQu/amoeba-2.0.1/bin
./amoeba start
十、测试 是否已经读写分离
1、将主库即server1的数据库 服务停止,查看通过 amoeba的中间件连接是否能连上数据库 以及是否可以写入数据(如配置正确,此处连接会失败)
2、停止server2的mysql服务,查看是否能够连接上中间件,以及读写数据(正常情况能够连接上,能写数据,但是不能查询数据)