centos amoeba+mysql主从集群分离
配置主从之前最好不要填写同步的数据库,默认都同步所有数据库就行。
mysql 本机自带的,java 本机自带的。
server-id = 1 //数据库ID号, 为1时表示为Master,其中master_id必须为1到232–1之间的一个正整数值;
log-bin=mysql-bin //启用二进制日志;
binlog-do-db=data //需要同步的二进制数据库名; (最好不要写,默认就同步所有数据库了)
log=/usr/local/log/mysql.log 日志位置。需要创建目录和改变权限chmod、chown命令
{上边配置主库已经够用了,下边我列出一些东西可以根据自己需要添加
default-storage-engine=innodb –默认的存储引擎,现在Mysql的主打存储引擎
innodb_data_home_dir =/data –innodb的数据家目录
innodb_data_file_path =ibdata1:50M:autoextend –innodb的数据存储文件,当写绝对路径时,innodb_data_home_dir要为空,这样可以指定多个存储文件,使用分号隔开
server-id = 1 –mysql服务器的id号:(1-2^32),id号越小优先级越高
log-bin = /dblog/mysqld-bin –二进制日志
max-binlog-size = 10M –mysqlbinlog的单个文件最大是10M
expire_logs_days = 10 –日志最大存储日期
#logs
slow_query_log = /dblog/slow.log –慢日志,在生产环境一定要记得开启
long_query_time = 2 –定义超过2秒的查询属于慢查询
log-queries-not-using-indexes=1
log-error = /dblog/mysqld.err –错误日志
查询日志不要开,因数据大,影响I/O,排错才使用。
log-bin:每次重启Mysql都会产生一个新的文件
# mkdir /data –建立数据存放目录
# mkdir /dblog –建立日志存放目录
# chmod 700 /data/ /dblog –修改权限
# chown mysql.mysql /data /dblog/ -R
# mysql_install_db –datadir=/data –user=mysql –进行初始化
# service mysql start –启动服务,如出现找不到PID,请检查selinux,iptables是否开启
}
2、建立复制所要使用的用户;
(先说登录,登录不进去就没法授权和建立用户) 本机自带的mysql 登录 第一次没有密码 为空 直接登录就可以
设置密码的命令如下:mysqladmin -uroot -p(旧密码,没有就不写) password 新密码 然后回车
会提示输入密码,不用输入密码,直接回车就可以了,密码就设置了。
建立复制用户命令 mysql>grant replication slave on *.* to ‘slave‘@‘%‘ IDENTIFIED BY ‘888888‘
3、重启mysql;
service mysqld restart
4 、(如果同步的主库有数据,则需要备份,没有则略过这一步)现在备份Master上的数据;
锁定后我直接tar.gz data这个库文件;
mysql>FLUSH TABLES WITH READ LOCK;
cd /var/lib/mysql
tar data.tar.gz data
接着直接执行了远程scp;
scp ./data.tar.gz root@ip地址:/var/lib/mysql
主库解锁命令是 mysql>unlock tables;
5、授权以后,查看主库状态,
登录mysql 授予登录权限,给远程ip赋予登录权限mysql>grant all privileges on *.*
to ‘root‘@‘%‘identified by ‘888888‘with grant option;单独给IP赋予远程管理权限是mysql>grant all privileges on *.* to ‘root‘@‘远程的ip‘identified by ‘888888‘with grant option;给本地赋予权限是 grant
all privileges on *.* to ‘root‘@‘localhost‘ identified
by ‘root‘ with grant option)
查看状态:mysql>show master status\G
记录pos和第一个文件名称。从库同步需要用(同第9步一样)
查看了主库状态,就不要在主库上做任何操作,否则file拦文件会改变。
6 slave 设置
登录Slave数据库服务器,修改my.cnf;
server-id = 3 //2已经被用在另一个服务器上了,如果以后要再加Slave号接着往后数就OK了;
log-bin=mysql-bin
master-host = 主库ip
master-user = slave
master-password = 888888
master-port = 3306
master-connect-retry=60 //如果发现主服务器断线,重新连接的时间差;
replicate-do-db=data //需要备份的数据库
7 解压刚才从Master scp过来的文件,此处不用改权限、属主,默认没有改变,可以根据实际情况进行修改;
8、上述完成后,可以启动slave了;查看slave状态;
mysql>slave start;
mysql>show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.1
Master_User: test
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: updatelog.000001
Read_Master_Log_Pos: 106
Relay_Log_File: onlinevc-relay-bin.000013
Relay_Log_Pos: 1069
Relay_Master_Log_File: updatelog.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: data
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 106
Relay_Log_Space: 1681
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
9、查看Master上面的状态;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| updatelog.000012 | 15016 | data | mysql |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
由此可见两者的File、Position存在问题,所要要去Slave上设置对应主库的Master_Log_File、Read_Master_Log_Pos;执行如下语句;
mysql>slave stop;
mysql>CHANGE MASTER TO MASTER_HOST=‘主库ip‘,MASTER_USER=‘slave‘, MASTER_PASSWORD=‘******‘,MASTER_LOG_FILE=‘updatelog.000012‘,MASTER_LOG_POS=15016;
确保 Slave_IO_Running: Yes 、Slave_SQL_Running: Yes都要为YES才能证明Slave的I/O和SQL进行正常
10、在这期间登录mysql经常会用到一些语句,我写下来。
show databases;
show tables;
create database 库明
create table 表明(id int, name varchar(100));
insert into values(a,tom)
create table 表明(id int)
insert
into 表明 values(1)
drop table 表明
delete from user where user=‘删除用户‘
select * from user,host from user; 查看用户和登录权限的
use 库明
MySQL插入100万条记录测试
存储过程
BEGIN
#Routine body goes here...
DECLARE i INT DEFAULT 0;
WHILE i < 1000000 DO
INSERT INTO test values(i, concat(‘zhangsan‘,i));
SET i = i + 1;
END WHILE;
END
装amoeba之前,要把amoeba连接数据库的用户名和密码一定要授权,命令如下:
建立amoeab用户赋予权限命令:grant all on *.* to ‘amoebauser‘@‘%‘identified by ‘amoebapassword‘
注:在mysql主库上边授权.
tar xzf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
配置全局环境变量
vi /etc/profile
export PATH=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/bin:$PATH
export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/
export AMOEBA_HOME=/usr/local/amoeba
export PATH=/usr/local/amoeba/bin:$PATH
说一下java的变量,可以用which java 和whereis java去查找,找不到就用 find / -name java 查找,不要被连接文件糊弄了。要看清楚。
我这里就用 find / -name java 查找的。
然后 让环境变量生效
source /etc/profile
11、Amoeba for mysql配置
配置Amoeba for mysql的读写分离主要涉及两个文件:
1、/usr/local/amoeba/conf/dbServers.xml
此文件定义由Amoeba代理的数据库如何连接,比如最基础的:主机IP、端口、Amoeba使用的用户名和密码等等。
2、/usr/local/amoeba/conf/amoeba.xml
此文件定义了Amoeba代理的相关配置。
dbServers.xml文件配置
abstractServer配置:
- <dbServer name="abstractServer" abstractive="true">
- <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
- <property name="manager">${defaultManager}</property>
- <property name="sendBufferSize">64</property>
- <property name="receiveBufferSize">128</property>
- <!-- mysql port -->
- <property name="port">3306</property>
- <!-- mysql schema -->
- <property name="schema">dbname</property>
- <!-- mysql user -->
- <property name="user">root</property>
- <!-- mysql password -->
- <property name="password">root</property>
- </factoryConfig>
- <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
- <property name="maxActive">500</property>
- <property name="maxIdle">500</property>
- <property name="minIdle">10</property>
- <property name="minEvictableIdleTimeMillis">600000</property>
- <property name="timeBetweenEvictionRunsMillis">600000</property>
- <property name="testOnBorrow">true</property>
- <property name="testWhileIdle">true</property>
- </poolConfig>
- </dbServer>
此部分定义真实mysql服务器的端口,数据库名称,mysql用户及密码。
主从数据库定义:
- <dbServer name="Master" parent="abstractServer">
- <factoryConfig>
- <!-- mysql ip -->
- <property name="ipAddress">192.168.0.1</property>
- </factoryConfig>
- </dbServer>
- <dbServer name="Slave1" parent="abstractServer">
- <factoryConfig>
- <!-- mysql ip -->
- <property name="ipAddress">192.168.0.2</property>
- </factoryConfig>
- </dbServer>
- <dbServer name="Slave2" parent="abstractServer">
- <factoryConfig>
- <!-- mysql ip -->
- <property name="ipAddress">192.168.0.3</property>
- </factoryConfig>
- </dbServer>
- <dbServer name="virtualSlave" virtual="true">
- <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>
- </poolConfig>
- </dbServer>
此部分定义主服务器,从服务器,及从服务器连接池。这里只定义数据库地址,它们的用户及密码就是上面的abstractServer里的设置。注意用来连接真实mysql服务器的用户必须拥有远程连接权限。
amoeba.xml配置
amoeba连接验证配置:
- <property name="authenticator">
- <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
- <property name="user">root</property>
- <property name="password">root</property>
- <property name="filter">
- <bean class="com.meidusa.amoeba.server.IPAccessController">
- <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
- </bean>
- </property>
- </bean>
- </property>
这里定义连接amoeba时用来验证的用户及密码。
读写分离配置:
- <property name="defaultPool">Master</property>
- <property name="writePool">Master</property>
- <property name="readPool">virtualSlave</property>
defaultPool:配置了默认的数据库节点,一些除了SELECTUPDATEINSERTDELETE的语句都会在defaultPool执行。
writePool :配置了数据库写库,通常配为Master,如这里就配置为之前定义的Master数据库。
readPool :配置了数据库读库,通常配为Slave或者Slave组成的数据库池,如这里就配置之前的virtualSlave数据库池。
amoeba启动
启动命令:
- amoeba start (前台启动可以查看报错信息
The stack size specified is too small, Specify at least 160k Could not create the Java virtual machine.
修改 amoeba 文件,vi /usr/local/amoeba/bin/amoeba,找到如下的文件:
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"
将其修改为:
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k
再次执行/usr/local/amoeba/bin/amoeba,如果出现amoeba start|stop 就可以启动amoeba了
# /usr/local/amoeba/bin/amoeba start
此命令以前台的方式启动,会输出启动时的信息,检查没有错误信息后,中断,并后台运行:
- nohup amoeba start &(后台启动命令)
还有一些错误我列出来,
比如 我想把mysql从库改为主库,这时候你更改完所有配置文件,你在主库上边mysql> show master status查看时候,可以看到以前打的连接状态,怎么办?
需要登录mysql 执行以前命令
mysql> slave stop;
mysql>change master to master_host=‘ ‘; 就可以了
mysql 主从集群做好了后,这时候一不小心从主库上删掉一个数据库数据,从库没有这个数据库,这时候 Slave_SQL_Running: NO,会变成NO,解决方法有两种如下
记录File和Position对应的值。
mysql> show master status;
+------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.000013 | 330748356| | |
+------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)
到slave服务器上执行手动同步:
mysql> slave stop;
mysql> change master to
> master_log_file=‘mysql-bin.000013‘,
> master_log_pos=330748356;
1 row in set (0.00 sec)
mysql> slave start;
1 row in set (0.00 sec)
再次查看slave状态发现:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
Seconds_Behind_Master: 0
解决办法二:
mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。