暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

原创|NO.A.0027|网络服务|——|mysql集群|主从备份|主主备份|一主多从|多主一从|中间件-Amoeba读写分离|

Java BBS 2021-04-09
173

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/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=mysql-bin #启动二进制日志
server-id=21 #服务器的ID号


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-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/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=mysql-bin #启动二进制日志
server-id=22 #服务器的ID号


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[root@server22 ~]# chkconfig mysqld on
[root@server22 ~]# service mysqld start

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

#1、在主服务器授权
[root@server21 ~]# mysql
mysql> 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 ~]# mysql
mysql> 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为授权信息
15
mysql-bin.000003
257
20.20.20.21
slave
123456
3306
60
0
0

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

[root@server22 ~]# mysql
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 event
Master_Host: 20.20.20.21
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 257
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes                      #线程已启用,两个都为yes即OK;
Slave_SQL_Running: Yes                                  #线程已启用,两个都为yes即OK;
Exec_Master_Log_Pos: 257
Relay_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)
#从服务器上查看主服务器是否删除成功,数据库是否已经同步OK
mysql> 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/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-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.log
pid-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/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=mysql-bin
server-id=22
#replicate-do-db=test
binlog-ignore-db=mysql
##binlog-ignore-db=information_schema
##auto-increment-increment=2
##auto-increment-offset=1


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-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 ~]# mysql
mysql> 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 ~]# mysql 
mysql> 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 event
Master_Host: 20.20.20.22
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 257
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Exec_Master_Log_Pos: 257
Relay_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/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=mysql-bin
server-id=23
#replicate-do-db=test
binlog-ignore-db=mysql
###binlog-ignore-db=information_schema
###auto-increment-increment=2
###auto-increment-offset=1


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-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/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=mysql-bin
server-id=21


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[root@server21 ~]# chkconfig mysqld on
[root@server21 ~]# service mysqld start
#授权
[root@server21 ~]# mysql
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.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/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=mysql-bin
server-id=22


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[root@server22 ~]# chkconfig mysqld on
[root@server22 ~]# service mysqld start
#授权
[root@server22 ~]# mysql
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.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/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid


[mysqld_multi]
mysqld=/usr/bin/mysqld_safe
mysqladmin=/usr/bin/mysqladmin
log=/tmp/multi.log


[mysqld21]
port=3306
datadir=/var/lib/mysqla/
pid-file=/var/lib/mysqla/mysqld.pid
socket=/var/lib/mysqla/mysql.sock
user=mysql
server-id=23 #当前服务器的ID


[mysqld22]
port=3307
datadir=/var/lib/mysqlb/
pid-file=/var/lib/mysqlb/mysqld.pid
socket=/var/lib/mysqlb/mysql.sock
user=mysql
server-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/mysql
mysqla/ 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 -antp
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1864/mysqld
tcp 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.sock
mysql> 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.sock
mysql> 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上创建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)
//主服务器1上删除abc
mysql> 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中间件

  • 中间件:一种提供在不同技术、不同的软件之间共享资源的程序,更大化了利用了数据库的性能,可以无限扩展(注:真实环境中并非如此)

  • 数据库的中间件:

  1. mysql proxy (官方版本) 性能低,需要 lua 脚本

  2. atlas 性能低,响应时间长

  3. 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.cnf
log-bin=mysql-bin
server-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.cnf
log-bin=mysql-bin
server-id=22
[root@server22 ~]# chkconfig mysqld on
[root@server22 ~]# service mysqld start
#在主服务器上授权,从服务器上保存授权信息,并开启从服务线程。
//配置主服务器
[root@server21 ~]# mysql
mysql> 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 ~]# mysql
mysql> 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;                         #在主服务上创建数据库atyanqi
Query OK, 1 row affected (0.00 sec)
mysql> use atyanqi;
Database changed
mysql> create table yjs (id int,name char(20),age int);   #在atyanqi数据库中插入表yjs
Query 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 + amoeba
export JAVA_HOME=/amoeba/jdk
export PATH=$JAVA_HOME:/bin:$PATH
export 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 -version
java 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 NO
warranty; 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/amoeba
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"

DBServerList结构图

#在主和从服务器上进行指定用户授权,授权目的为了让 amoeba 能连接到主从服务器进行查询。
// nohup bash -x /usr/local/amoeba/bin/amoeba &
#1、在主服务器上授权
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.22
mysql> 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 amoeba
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 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.Launcher
root 1976 0.0 0.0 103312 876 pts/0 S+ 15:13 0:00 grep amoeba
[root@server23 ~]# netstat -antp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 ::ffff:20.20.20.23:8066 :::* LISTEN 1945/java

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

[root@server23 ~]# mysql -uamoeba -p123456 -P8066 -h20.20.20.23
mysql>

在主、从服务器上创建表 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中间件

  • 中间件:一种提供在不同技术、不同的软件之间共享资源的程序,更大化了利用了数据库的性能,可以无限扩展(注:真实环境中并非如此)

  • 数据库的中间件:

  1. mysql proxy (官方版本) 性能低,需要 lua 脚本

  2. atlas 性能低,响应时间长

  3. 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







文章转载自Java BBS,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论