mysql集群
二、MySQL 安装部署
技术点:bin-log日志
开启主服务器的bin-log日志记录功能,将主服务器的bin-log日志传到从服务器,从服务器根据日志内容将数据还原到本地。
主从服务器:1. 从服务器主动把主服务器上的数据同步到本地(备份)2. 从服务器分摊主服务器的查询压力(负载均衡)主主服务器
1. 均摊写压力一、mysql主从备份
前提条件:安装了 mysql,开启了二进制日志
#环境规划:// server21:20.20.20.21:主服务器// server22:20.20.20.22:从服务器#部署主:server21[root@server21 ~]# yum install -y mysql mysql-server[root@server21 ~]# vim /etc/my.cnf[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysql# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0log-bin=mysql-bin #启动二进制日志server-id=21 #服务器的ID号[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid[root@server21 ~]# chkconfig mysqld on[root@server21 ~]# service mysqld start
#部署从:server22[root@server22 ~]# yum install -y mysql mysql-server[root@server22 ~]# vim /etc/my.cnf[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysql# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0log-bin=mysql-bin #启动二进制日志server-id=22 #服务器的ID号[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid[root@server22 ~]# chkconfig mysqld on[root@server22 ~]# service mysqld start
在主服务器上授权,从服务器保存授权信息
#1、在主服务器授权[root@server21 ~]# mysqlmysql> grant replication slave on *.* to slave@'20.20.20.22' identified by '123456';Query OK, 0 rows affected (0.00 sec) #replication:特殊的授权权限,*.*:所有的库和表mysql> show master status;+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000003 | 257 | | |+------------------+----------+--------------+------------------+1 row in set (0.00 sec)#Position:257,在从服务器上确认#从服务器保存授权信息[root@server22 ~]# mysqlmysql> change master to-> master_user='slave', # 超级用户-> master_password='123456', # 密码-> master_host='20.20.20.21', # 主服务器地址-> master_log_file='mysql-bin.000003', # 主服务器使用的二进制日志-> master_log_pos=257; # 当前日志大小和Position数据一致Query OK, 0 rows affected (0.06 sec)
之后再从服务器会产生授权信息文件
[root@server22 ~]# cat /var/lib/mysql/master.info #master.info为授权信息15mysql-bin.00000325720.20.20.21slave12345633066000
开启从服务器 start slave,并查看
[root@server22 ~]# mysqlmysql> start slave; #启动从服务器Query OK, 0 rows affected (0.00 sec)mysql> show slave status\G; #查看从服务器的内容*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 20.20.20.21Master_User: slaveMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000003Read_Master_Log_Pos: 257Relay_Log_File: mysqld-relay-bin.000002Relay_Log_Pos: 251Relay_Master_Log_File: mysql-bin.000003Slave_IO_Running: Yes #线程已启用,两个都为yes即OK;Slave_SQL_Running: Yes #线程已启用,两个都为yes即OK;Exec_Master_Log_Pos: 257Relay_Log_Space: 407
测试
#从服务器上查看已有数据库mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || test |+--------------------+3 rows in set (0.01 sec)#主服务器上创建abc数据库mysql> create database abc;Query OK, 1 row affected (0.00 sec)#在从服务器上查看主服务器上创建的数据库是否已经生成mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || abc || mysql || test |+--------------------+4 rows in set (0.00 sec)#主服务器上删除abc数据库mysql> drop database abc;Query OK, 0 rows affected (0.01 sec)#从服务器上查看主服务器是否删除成功,数据库是否已经同步OKmysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || test |+--------------------+3 rows in set (0.00 sec)
二、mysql主主备份
1. 以 1 为主,2 为从配置一遍主从
在主配置文件中配置一下(开启二进制日志和其他内容)
#部署规划# server21:20.20.20.21 主服务器1# server22:20.20.20.22 主服务器2#1、部署主服务器1:[root@server21 ~]# service mysqld stop[root@server21 ~]# vim /etc/my.cnf[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysql# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0log-bin=mysql-bin #开启二进制日志server-id=21 #开启二进制日志#replicate-do-db=test #提高效率,将不必要的资源不写入二进制文件binlog-ignore-db=mysql #忽略掉mysqld的同步#binlog-ignore-db=information_schema#auto-increment-increment=2 #防止主键冲突,数据的ID号从1开始,每次+2即1,3,5,7......#auto-increment-offset=1[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid[root@server21 ~]# service mysqld start
2、在主服务器2上做相同的配置
#1、部署主服务器1:[root@server22 ~]# service mysqld stop[root@server22 ~]# vim /etc/my.cnf[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysql# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0log-bin=mysql-binserver-id=22#replicate-do-db=testbinlog-ignore-db=mysql##binlog-ignore-db=information_schema##auto-increment-increment=2##auto-increment-offset=1[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid[root@server22 ~]# service mysqld start
3、启动服务器
[root@server21 ~]# service mysqld start[root@server22 ~]# service mysqld start
1 为主 2 为从:
在主服务器(1)上授权
[root@server22 ~]# mysqlmysql> grant replication slave on *.* to slave@'20.20.20.21' identified by '123456';Query OK, 0 rows affected (0.00 sec)mysql> show master status;+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000004 | 257 | | mysql |+------------------+----------+--------------+------------------+1 row in set (0.00 sec)
在从服务器(2)上保存授权信息
[root@server21 ~]# mysqlmysql> change master to master_user='slave',master_password='123456',master_host='20.20.20.22',master_log_file='mysql-bin.000004',master_log_pos=257;Query OK, 0 rows affected (0.05 sec)mysql> start slave;Query OK, 0 rows affected (0.00 sec)mysql> show slave status\G;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 20.20.20.22Master_User: slaveMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000004Read_Master_Log_Pos: 257Relay_Log_File: mysqld-relay-bin.000002Relay_Log_Pos: 251Relay_Master_Log_File: mysql-bin.000004Slave_IO_Running: YesSlave_SQL_Running: YesExec_Master_Log_Pos: 257Relay_Log_Space: 407
测试
#主服务器1上测试mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || test |+--------------------+3 rows in set (0.00 sec)#主服务器1上创建abc数据库mysql> create database abc;Query OK, 1 row affected (0.00 sec)#主服务器2上查看是否创建成功mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || abc || mysql || test |+--------------------+4 rows in set (0.00 sec)#主服务器2上删除abc数据库mysql> drop database abc;Query OK, 0 rows affected (0.05 sec)#主服务器上查看是否删除abc成功mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || test |+--------------------+3 rows in set (0.00 sec)
三、mysql一主多从
主服务器配置
#部署规划;在原来基础之上部署centos6.x server1:20.20.20.21 #主centos6.x server2:20.20.20.22 #从centos6.x server3:20.20.20.23 #从#环境准备:#centos6.x server1: 为主#把centos6.x server1 的从停掉mysql> stop slave;Query OK, 0 rows affected (0.00 sec)#配置从服务器centos6.x server23[root@server23 ~]# yum install -y mysql-server mysql[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysql# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0log-bin=mysql-binserver-id=23#replicate-do-db=testbinlog-ignore-db=mysql###binlog-ignore-db=information_schema###auto-increment-increment=2###auto-increment-offset=1[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid#授权23为从服务器[root@server23 ~]# service mysqld start#在21主服务器上授权mysql> grant replication slave on *.* to slave@'20.20.20.23' identified by '123456';Query OK, 0 rows affected (0.00 sec)mysql> show master status;+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000004 | 338 | | mysql |+------------------+----------+--------------+------------------+1 row in set (0.00 sec)#从服务器23接收授权mysql> change master to master_user='slave',master_password='123456',master_host='20.20.20.21',master_log_file='mysql-bin.000004',master_log_pos=338;Query OK, 0 rows affected (0.07 sec)
测试
#在主服务器上创建a1数据库mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || test |+--------------------+3 rows in set (0.00 sec)mysql> create database a111 ;Query OK, 1 row affected (0.00 sec)#第一个22从服务器查看是否创建a111数据库mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || a111 || mysql || test |+--------------------+4 rows in set (0.00 sec)#第二个23从服务器查看是否创建a111数据库mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || a111 || mysql || test |+--------------------+4 rows in set (0.00 sec)
四、MySQL 多主一从
主服务器配置
开启二进制日志,启动服务
#部署规划#centos6.x server21:20.20.20.21 主服务器1#centos6.x server22:20.20.20.22 主服务器2#centos6.x server23:20.20.20.23 从服务器1
配置主服务器1
[root@server21 ~]# yum install -y mysql mysql-server[root@server21 ~]# vim /etc/my.cnf[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysql# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0log-bin=mysql-binserver-id=21[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid[root@server21 ~]# chkconfig mysqld on[root@server21 ~]# service mysqld start#授权[root@server21 ~]# mysqlmysql> grant replication slave on *.* to slave@'20.20.20.23' identified by '123456';Query OK, 0 rows affected (0.00 sec)mysql> show master status;+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000003 | 257 | | |+------------------+----------+--------------+------------------+1 row in set (0.00 sec)
配置主服务器2
[root@server22 ~]# yum install -y mysql mysql-server[root@server22 ~]# vim /etc/my.cnf[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysql# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0log-bin=mysql-binserver-id=22[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid[root@server22 ~]# chkconfig mysqld on[root@server22 ~]# service mysqld start#授权[root@server22 ~]# mysqlmysql> grant replication slave on *.* to slave@'20.20.20.23' identified by '123456';Query OK, 0 rows affected (0.00 sec)mysql> show master status;+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000003 | 257 | | |+------------------+----------+--------------+------------------+1 row in set (0.00 sec)
配置从服务器1
[root@server23 ~]# yum install -y mysql mysql-server[root@server23 ~]# vim /etc/my.cnf[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysql# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid[mysqld_multi]mysqld=/usr/bin/mysqld_safemysqladmin=/usr/bin/mysqladminlog=/tmp/multi.log[mysqld21]port=3306datadir=/var/lib/mysqla/pid-file=/var/lib/mysqla/mysqld.pidsocket=/var/lib/mysqla/mysql.sockuser=mysqlserver-id=23 #当前服务器的ID[mysqld22]port=3307datadir=/var/lib/mysqlb/pid-file=/var/lib/mysqlb/mysqld.pidsocket=/var/lib/mysqlb/mysql.sockuser=mysqlserver-id=23 #当前服务器的ID#初始化数据库,生成目录mysqla,mysqlb[root@server23 ~]# mysql_install_db --datadir=/var/lib/mysqla --user=mysql[root@server23 ~]# mysql_install_db --datadir=/var/lib/mysqlb --user=mysql[root@server23 ~]# ll /var/lib/mysqlmysqla/ mysqlb/#设置 mysqla,mysqlb 目录及以下文件的属主为 mysql(防止出现权限问题)[root@server23 ~]# chown -R mysql /var/lib/mysqla/[root@server23 ~]# chown -R mysql /var/lib/mysqlb/#启动从服务器线程[root@server23 ~]# mysqld_multi --defaults-file=/etc/my.cnf start 21[root@server23 ~]# mysqld_multi --defaults-file=/etc/my.cnf start 22[root@server23 ~]# netstat -antptcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1864/mysqldtcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 1986/mysqld#分别登录并保存授权信息//登录3306端口的并保存授权信息(20.20.20.21)[root@server23 ~]# mysql -uroot -P 3306 -S /var/lib/mysqla/mysql.sockmysql> change master to-> master_user='slave',-> master_password='123456',-> master_host='20.20.20.21',-> master_log_file='mysql-bin.000003',-> master_log_pos=257;Query OK, 0 rows affected (0.05 sec)//启动从的进程mysql> start slave;Query OK, 0 rows affected (0.00 sec)//登录3307端口的并保存授权信息(20.20.20.22)[root@server23 ~]# mysql -uroot -P 3307 -S /var/lib/mysqlb/mysql.sockmysql> change master to-> master_user='slave',-> master_password='123456',-> master_host='20.20.20.22',-> master_log_file='mysql-bin.000003',-> master_log_pos=257;Query OK, 0 rows affected (0.08 sec)//启动从的进程mysql> start slave;Query OK, 0 rows affected, 1 warning (0.00 sec)
测试
#在主服务器1:20.20.20.21上创建数据库,看从服务器20.20.20.23是否同步数据库//主服务器1上创建abcmysql> create database abc;Query OK, 1 row affected (0.00 sec)//从服务器上查看mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || abc || mysql || test |+--------------------+4 rows in set (0.00 sec)//主服务器1上删除abcmysql> drop database abc;Query OK, 0 rows affected (0.00 sec)//从服务器上查看mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || test |+--------------------+3 rows in set (0.00 sec)#在主服务器2:20.20.20.22上创建数据库,看从服务器20.20.20.23是否同步数据库//主服务器2上创建a111;mysql> create database a111;Query OK, 1 row affected (0.00 sec)//从服务器上查看mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || a111 || mysql || test |+--------------------+4 rows in set (0.00 sec)//主服务器2上删除a111;mysql> drop database a111;Query OK, 0 rows affected (0.00 sec)//从服务器上查看mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || test |+--------------------+3 rows in set (0.00 sec)#两个各自接受各自的授权。
五、mysql中间件
中间件:一种提供在不同技术、不同的软件之间共享资源的程序,更大化了利用了数据库的性能,可以无限扩展(注:真实环境中并非如此)
数据库的中间件:
mysql proxy (官方版本) 性能低,需要 lua 脚本
atlas 性能低,响应时间长
amoeba 陈思儒研发的

一.先搭建一个主从关系的服务器
#部署规划#centos6.x server21:20.20.20.21 主服务器#centos6.x server21:20.20.20.21 从服务器#centos6.x server21:20.20.20.21 amoeba服务器
在主、从服务器上安装 mysql mysql-server
#在主从服务器上安装mysql服务端和客户端;并开启二进制日志[root@server21 ~]# yum install -y mysql mysql-server[root@server21 ~]# vim /etc/my.cnflog-bin=mysql-binserver-id=21[root@server21 ~]# chkconfig mysqld on[root@server21 ~]# service mysqld start[root@server22 ~]# yum install -y mysql mysql-server[root@server22 ~]# vim /etc/my.cnflog-bin=mysql-binserver-id=22[root@server22 ~]# chkconfig mysqld on[root@server22 ~]# service mysqld start#在主服务器上授权,从服务器上保存授权信息,并开启从服务线程。//配置主服务器[root@server21 ~]# mysqlmysql> grant replication slave on *.* to slave@'20.20.20.22' identified by '123456';Query OK, 0 rows affected (0.00 sec)mysql> show master status;+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000003 | 257 | | |+------------------+----------+--------------+------------------+1 row in set (0.00 sec)#关闭从服务器线程,为了做读写分离时,测试有明显的实验效果(实际生产环境中不能停掉。。)[root@server22 ~]# mysqlmysql> change master to-> master_user='slave',-> master_password='123456',-> master_host='20.20.20.21',-> master_log_file='mysql-bin.000003',-> master_log_pos=257;Query OK, 0 rows affected (0.05 sec)mysql> start slave;Query OK, 0 rows affected (0.00 sec)#测试//在主服务器上创建数据库和表mysql> create database atyanqi; #在主服务上创建数据库atyanqiQuery OK, 1 row affected (0.00 sec)mysql> use atyanqi;Database changedmysql> create table yjs (id int,name char(20),age int); #在atyanqi数据库中插入表yjsQuery OK, 0 rows affected (0.02 sec)mysql> insert into yjs values (1,'laow',28),(2,'laos',29); #在yjs表中写入数据Query OK, 2 rows affected (0.00 sec)Records: 2 Duplicates: 0 Warnings: 0//在主服务器上查看创建的表和数据mysql> select * from yjs;+------+------+------+| id | name | age |+------+------+------+| 1 | laow | 28 || 2 | laos | 29 |+------+------+------+2 rows in set (0.00 sec)//在从服务器上查看创建的表和数据mysql> select * from atyanqi.yjs;+------+------+------+| id | name | age |+------+------+------+| 1 | laow | 28 || 2 | laos | 29 |+------+------+------+2 rows in set (0.00 sec)#停止从进程mysql> stop slave;Query OK, 0 rows affected (0.00 sec)mysql> insert into atyanqi.yjs values (3,'laox',18); #在从上面再加入一条数据Query OK, 1 row affected (0.01 sec)mysql> select * from atyanqi.yjs; #在从上面查看是3条数据+------+------+------+| id | name | age |+------+------+------+| 1 | laow | 28 || 2 | laos | 29 || 3 | laox | 18 |+------+------+------+3 rows in set (0.01 sec)mysql> select * from yjs; #主服务器上查看还是2条数据+------+------+------+ #在生产环境中是不会出现这种情况的。| id | name | age |+------+------+------+| 1 | laow | 28 || 2 | laos | 29 |+------+------+------+2 rows in set (0.00 sec)#启动从服务器的服务mysql> start slave;Query OK, 0 rows affected (0.00 sec)
二.配置读写分离
1.安装 gcc 环境(amoeba 需要源码安装)
[root@server23 ~]# yum -y install gcc*
2.拷贝第三方软件,创建单独的目录
#将amoeba-n.zip上传到服务器[root@server23 ~]# unzip amoeba-n.zip#创建单独的目录,用来存储安装amoeba相关的配置[root@server23 ~]# mkdir /amoeba
3.先安装 jdk(amoeba 是由 java 语言编写的,所以先安装 jdk),配置 java 环境
[root@server23 ~]# cd amoeba-n[root@server23 amoeba-n]# tar -zxvf jdk-7u40-linux-x64.gz[root@server23 amoeba-n]# cp -a jdk1.7.0_40/ /amoeba/jdk
4.声明用 java 写出来的程序如何调用(/etc/profile)
#配置JDK+amoeba的环境变量[root@server23 amoeba-n]# vim /etc/profile# java + amoebaexport JAVA_HOME=/amoeba/jdkexport PATH=$JAVA_HOME:/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/bin/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH[root@server23 amoeba-n]# source /etc/profile#验证JDK是否部署成功[root@server23 amoeba-n]# java -versionjava version "1.5.0"gij (GNU libgcj) version 4.4.7 20120313 (Red Hat 4.4.7-17)Copyright (C) 2007 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5.安装 amoeba
#1、安装amoeba[root@server23 amoeba-n]# unzip amoeba-mysql-1.3.1-BETA.zip -d /usr/local/amoeba#2、给amoeba赋予可执行权限[root@server23 amoeba]# chmod +x bin/*#3、修改amoeba配置文件[root@server23 amoeba]# vim conf/amoeba.xml//<server>.....</server>区域<server> #server区域的配置<!-- proxy server掳贸露篓碌?露?驴? --><property name="port">8066</property> #端口号<!-- proxy server掳贸露篓碌?IP --><property name="ipAddress">20.20.20.23</property> #amoeba安装的ip地址<!-- proxy server net IO Read thread size --><property name="readThreadPoolSize">20</property> #使用默认值<!-- proxy server client process thread size --><property name="clientSideThreadPoolSize">30</property><!-- mysql server data packet process thread size --><property name="serverSideThreadPoolSize">30</property><!-- socket Send and receive BufferSize(unit:K) --><property name="netBufferSize">128</property><!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). --><property name="tcpNoDelay">true</property><!-- 露??芒?茅?陇碌???禄搂?没 --><property name="user">amoeba</property> #登录amoeba的用户名,本来是root(和管理员用户没有关系)<!-- 露??芒?茅?陇碌????毛 --><property name="password">123456</property> #登录用户使用的密码<!-- query timeout( default: 60 second , TimeUnit:second) --><property name="queryTimeout">60</property></server>#连接主从数据库的参数[root@server23 amoeba]# vim conf/amoeba.xml<dbServerList>......</dbServerList>区域<dbServerList><dbServer name="server1"> #服务器名字<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"><property name="manager">defaultManager</property><property name="user">abc</property><property name="password">123456</property> #登录的是哪个数据库服务器(这里是主)</factoryConfig><poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool"><property name="maxActive">200</property><property name="maxIdle">200</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><dbServer name="server2"> #服务器名字<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"><property name="manager">defaultManager</property><property name="port">3306</property><property name="ipAddress">20.20.20.22</property> #登录的是哪个数据库服务器(这里是从)<property name="schema">atyanqi</property><property name="user">abc</property> #使用过的用户名是什么(这里是在从服务器上授权的那个用户)<property name="password">123456</property> #使用的密码</factoryConfig><poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool"><property name="maxActive">200</property><property name="maxIdle">200</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>#默认写的时候找谁写</dbServer><dbServer name="write" virtual="true"> #默认连接哪一个,默认连接主还是从,默认连接write用来写<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"><property name="loadbalance">1</property><property name="poolNames">server1</property>·· #默认连接时使用server1去连接</poolConfig></dbServer>#默认读的时候找谁读<dbServer name="read" virtual="true"><poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"><property name="loadbalance">1</property><property name="poolNames">server1,server2</property> #默认读的时候server1和server2都可以用来读</poolConfig></dbServer>#配置读写分离操作模块</dbServerList><queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter"><property name="ruleConfig">${amoeba.home}/conf/rule.xml</property><property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property><property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property><property name="LRUMapSize">1500</property><property name="defaultPool">write</property> #默认访问的池为write池<property name="writePool">write</property> #写的时候默认是write池<property name="readPool">read</property> #读的时候默认是read池<property name="needParse">true</property></queryRouter>#4.启动 amoeba,修改一下启动脚本:/usr/local/amoeba/bin/amoeba// 注意:将-Xss128k 修改为 –Xss256[root@server23 amoeba]# vim /usr/local/amoeba/bin/amoebaDEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"
DBServerList结构图

#在主和从服务器上进行指定用户授权,授权目的为了让 amoeba 能连接到主从服务器进行查询。// nohup bash -x /usr/local/amoeba/bin/amoeba 、在主服务器上授权mysql> grant all on atyanqi.* to abc@'20.20.20.23' identified by '123456';Query OK, 0 rows affected (0.00 sec)#2、在从服务器上授权mysql> grant all on atyanqi.* to abc@'20.20.20.23' identified by '123456';Query OK, 0 rows affected (0.00 sec)#3、使用amoeba服务器进行测试[root@server23 ~]# yum install -y mysql[root@server23 ~]# mysql -uabc -p123456 -h20.20.20.21 #连接主服务器mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || atyanqi || test |+--------------------+3 rows in set (0.00 sec)[root@server23 ~]# mysql -uabc -p123456 -h20.20.20.22mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || atyanqi || test |+--------------------+3 rows in set (0.00 sec)
把这个放到后台 退出终端也可以继续运行
[root@server23 ~]# nohup bash -x /usr/local/amoeba/bin/amoeba &[1] 1945[root@server23 ~]# nohup: ignoring input and appending output to `nohup.out' #自动输出
ps aux | grep amoeba
查看一下运行的程序 查看到的话就说明程序已经运行了起来
[root@server23 ~]# ps -aux |grep amoebaWarning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQroot 1945 3.9 3.1 1555704 60220 pts/0 Sl 15:12 0:00 /amoeba/jdk/bin/java -server -Xms256m -Xmx256m -Xss256k -Damoeba.home=/usr/local/amoeba -Dclassworlds.conf=/usr/local/amoeba/bin/amoeba.classworlds -classpath /usr/local/amoeba/lib/classworlds-1.0.jar org.codehaus.classworlds.Launcherroot 1976 0.0 0.0 103312 876 pts/0 S+ 15:13 0:00 grep amoeba[root@server23 ~]# netstat -antpActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program nametcp 0 0 ::ffff:20.20.20.23:8066 :::* LISTEN 1945/java
测试(安装一个 MySQL 软件包才可以连接)
[root@server23 ~]# mysql -uamoeba -p123456 -P8066 -h20.20.20.23mysql>
在主、从服务器上创建表 a1,在主服务器的表中插入数据
mysql> select * from atyanqi.yjs;+------+------+------+| id | name | age |+------+------+------+| 1 | laow | 28 || 2 | laos | 29 || 3 | laox | 18 |+------+------+------+3 rows in set (0.00 sec)mysql> select * from atyanqi.yjs;+------+------+------+| id | name | age |+------+------+------+| 1 | laow | 28 || 2 | laos | 29 |+------+------+------+2 rows in set (0.01 sec)#两次产生的结果不一致,说明它是从主从里面各查询一次,说明负载均衡实现OK
以上测试纯粹为了实验效果,在实际生产中,主从开启,主服务器上写入的数据也会同步到从服务器中
=============================END=================================
辅助文本
一、MySQL 主从备份
前提条件:安装了 mysql,开启了二进制日志

在主服务器上授权,从服务器保存授权的信息

之后在从服务器会产生授权信息文件

开启从服务器 start slave,并查看

测试

二、MySQL 主主备份
1. 以 1 为主,2 为从配置一遍主从
在主配置文件中配置一下(开启二进制日志和其他内容)

2. 在 2 上做相同的配置

3. 启动服务器

1 为主 2 为从:
在主服务器(1)上授权

在从服务器(2)上保存授权信息

2 为主 1 为从:
在主服务器(2)上授权

在从服务器(1)上保存授权信息

1 和 2 都执行 start slave(互为主从)

测试

三、MySQL 一主多从
主服务器配置
开启二进制日志,并启动 mysql

在主服务器上授权

从服务器配置
开启二进制日志,并启动 mysql

保存授权信息

#在另一台从服务器上做相同的配置(注意 id 不能相同)
测试

四、MySQL 多主一从
主服务器配置
开启二进制日志,启动服务

授权

在主服务器 2 上做相同的操作

授权

从服务器操作
对主配置文件操作

初始化数据库,生成目录 mysqla,mysqlb


设置 mysqla,mysqlb 目录及以下文件的属主为 mysql(防止出现权限问题)

启动从服务器线程

登录并保存授权信息


测试


五、mysql中间件
中间件:一种提供在不同技术、不同的软件之间共享资源的程序,更大化了利用了数据库的性能,可以无限扩展(注:真实环境中并非如此)
数据库的中间件:
mysql proxy (官方版本) 性能低,需要 lua 脚本
atlas 性能低,响应时间长
amoeba 陈思儒研发的
一.先搭建一个主从关系的服务器
在主、从服务器上安装 mysql mysql-server

1.开启二进制日志

2.在主服务器上授权,从服务器上保存授权信息,并开启从服务线程。

3.关闭从服务器线程,为了做读写分离时,测试有明显的实验效果(实际生产环境中不能停掉。)

二.配置读写分离
1.安装 gcc 环境(amoeba 需要源码安装)

2.拷贝第三方软件,创建单独的目录

3.先安装 jdk(amoeba 是由 java 语言编写的,所以先安装 jdk),配置 java 环境

4.声明用 java 写出来的程序如何调用(/etc/profile)

5.安装 amoeba

配置 amoeba 这个软件

<server>.....</server>区域

<dbServerList>......</dbServerList>区域

由于只提供了一个服务器模板,需要自己复制另一个填写关于读的


启动 amoeba,
修改一下启动脚本:/usr/local/amoeba/bin/amoeba

注意:将-Xss128k 修改为 –Xss256
#在主和从服务器上进行指定用户授权,授权目的为了让 amoeba 能连接到主从服务器进行查询。
nohup bash -x /usr/local/amoeba/bin/amoeba &
把这个放到后台 退出终端也可以继续运行

ps aux | grep amoeba
查看一下运行的程序 查看到的话就说明程序已经运行了起来

测试(安装一个 MySQL 软件包才可以连接)

在主、从服务器上创建表 a1,在主服务器的表中插入数据

之后在客户端登录测试
读取池的效果:

写入池效果

以上测试纯粹为了实验效果,在实际生产中,主从开启,主服务器上写入的数据也会同步到从服务器中
END
声明:JavaBBS论坛主要用于IT技术专题的交流学习,为开源技术爱好者提供广泛、权威的技术资料。若您在技术专题有更好的想法或者建议,欢迎交流!!!




推荐阅读
Recommended reading


JavaBBS
Git → https://www.javabbs.cn/git
JavaBBS大数据→ https://www.javabbs.cn/dsj
JavaBBS云存储→ https://www.javabbs.cn/ycc
JavaBBS数据库→ https://www.javabbs.cn/sjk
JavaBBS云计算→ https://www.javabbs.cn/yjs
JavaBBSIT.Log→ https://www.javabbs.cn/itl
JavaBBSNginx→ https://www.javabbs.cn/ngx
JavaBBSzabbix→ https://www.javabbs.cn/zbx
JavaBBSJavaSE→ https://www.javabbs.cn/jse JavaBBS社区文章→ https://www.javabbs.cn/bwz
JavaBBS社区资料→ https://www.javabbs.cn/bzl





