🗺️博客地图
一、mysql互为主从
(一)服务器1操作配置
1、安装数据库
yum -y install mysql mysql-server
vim /etc/my.cnf
log-bin=mysql-bin
server-id=20
replicate-do-db=test #要同步的数据库
binlog-ignore-db=mysql #不同步的数据库
binlog-ignore-db=information_schema
auto-increment-increment=2 #自增长的步长
auto-increment-offset=1 #自增长的初始值
2、启动数据库
service mysqld restart
3、设置root密码
mysqladmin -uroot password 123
4、登录数据库
mysql -uroot -p123
5、创建同步数据库(所有主主服务器同步数据库必须一致)
create database 数据库名;
6、创建同步用户并赋予权限
mysql> grant all on *.* to 'master01'@'%' identified by '123';
7、查询master用户的状态
mysql> show master status;
(二)服务器2操作配置
# 安装mysql数据库
yum -y install mysql mysql-server
# 在主配置文件中 [mysqld] 区域添加如下信息
vim /etc/my.cnf
log-bin=mysql-bin
server-id=30
replicate-do-db=test #要同步的数据库
binlog-ignore-db=mysql #不同步的数据库
binlog-ignore-db=information_schema
auto-increment-increment=2 #自增长的步长
auto-increment-offset=2 #自增长的初始值# 启动mysqld服务
service mysqld restart
# 设置root密码
mysqladmin -uroot password 123
# 进入数据库
mysql -uroot -p123
# 创建同步数据库(所有主主服务器同步数据库必须一致)
mysql> grant all on *.* to 'master02'@'%' identified by '123';
# 执行以下sql语句(此处设置的信息全部为主服务器1上的信息)
mysql> change master to master_user='master01',master_password='123',master_host='192.168.43.20',master_log_file='mysql-bin.000004',master_log_pos=106;# 启动slave
mysql> start slave;# 验证上述sql语句是否成功执行
mysql> show slave status\G;
(三)服务器1配置
mysql -uroot -p123
mysql> change master to master_user='master02',master_password='123',master_host='192.168.43.30',master_log_file='mysql-bin.000004',master_log_pos=240;
mysql> start slave;
mysql> show slave status\G;
(四)检验测试
各在服务器1和服务器2的test库插入数据
mysql> insert into test.users values (4,"song");
测试是否同步
mysql> select * from test.users;
二、MySQL数据库读写分离
(一)背景
Nginx、PHP属于无状态服务,其水平扩展很方便,但MySQL数据库是典型的有状态服务,其水平扩展很难,为解决这一问题,我们需要在PHP和MySQL之间添加一个数据库中间键,该中间键水平扩展很方便,其作用是承上(承接MySQL客户端的访问请求)启下(向MySQL服务器端获取或写入数据),该中间键还能实现数据库读写分离。
(二)原理
当客户端向proxy请求写入数据时,proxy与MySQL主服务器建立连接,并将数据写入主服务器,主服务器将数据同步至多台从服务器;当客户端向proxy请求获取数据时,proxy与MySQL从服务器建立连接,实现负载均衡,降低服务器压力。

(三)Amoeba简介
Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它由阿里巴巴源首席架构师陈思儒主导开发。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单)。
Amoeba相当于一个SQL请求的路由器,目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。用户需要结合使用MySQL的 Replication等机制来实现副本同步等功能。amoeba对底层数据库连接管理和路由实现也采用了可插拨的机制,第三方可以开发更高级的策略类来替代作者的实现。这个程序总体上比较符合KISS原则的思想。
1、优势:
Amoeba主要解决以下问题:
a). 数据切分后复杂数据源整合
b). 提供数据切分规则并降低数据切分规则给数据库带来的影响
c). 降低数据库与客户端连接
d). 读写分离路由
2、不足:
a)、还不支持事务
b)、暂时不支持存储过程(近期会支持)
c)、不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)
d)、暂时不支持分库分表,amoeba只做到分数据库实例,每个被切分的节点需要保持库表结构一致。
(四)项目实践
1、构建mysql主从从服务器
a)主服务器配置
yum -y install mysql mysql-server
vim /etc/my.cnf
[mysqld]
server-id=20
log-bin=mysql-binservice mysqld start
mysqladmin -uroot password 123
mysql -uroot -p123
mysql> grant all on *.* to 'master'@'%' identified by '123';
mysql> show master status;
b)从服务器1配置
yum -y install mysql mysql-server
vim /etc/my.cnf
[mysqld]
server-id=30
log-bin=mysql-binservice mysqld start
mysqladmin -uroot password 123
mysql -uroot -p123
mysql> change master to
master_user='master',master_password='123',master_host='192.168.43.20',master_log_file='mysql-bin.000003',master_log_pos=371;
mysql> start slave;
mysql> show slave status\G;
# 从服务器2配置同上,配置两个从服务器设置一致,仅仅server-id不同
c)检验测试
主服务器:
mysql> create database test;
mysql> use test;
mysql> create table users (id int;name char(200));
mysql> insert into users values (1,"li");
从服务器:
mysql> select * from test.users;
#为了实验效果,测试连接是主服务器还是从服务器,先将两台从服务器同步关闭:
mysql> stop slave;
从服务器1:
mysql> insert into users values (2,"zhang");
从服务器2:
mysql> insert into users values (3,"wang");
2、配置Amoeba安装环境
a)上传amoeba软件包
yum -y install gcc gcc-c++
mkdir /mnt/iso
mount -o loop amoeba-n.iso /mnt/iso
cp -a /mnt/iso/* .
tar -zxvf jdk-7u40-linux-x64.gz
mv jdk1.7.0_40/ /usr/local/jdk
vim /etc/profile
#JDK
JAVA_HOME=/usr/local/jdk
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export CLASSPATHsource /etc/profile #刷新配置文件使其生效
Java -varsion #查看Java版本信息
3、安装Amoeba服务器
unzip amoeba-mysql-1.3.1-BETA.zip -d /usr/local/amoeba
chmod -R a+x /usr/local/amoeba/bin/
cd /usr/local/amoeba/conf/
vim amoeba.xml
<property name="port">9000</property>
<property name="ipAddress">192.168.43.10</property>
……
<property name="password">123</property>
<dbServerList><dbServer name="server1">
<factoryConfig……>
<property name="manager">defaultManager</property>
<property name="port">3306</property>
<property name="ipAddress">192.168.43.20</property>
<property name="schema">test</property>
<property name="user">amoeba</property>
<property name="password">123</property>
</factoryConfig>
<poolConfig……>
</poolConfig>
</dbServer><dbServer name="server2">
<factoryConfig……>
<property name="manager">defaultManager</property>
<property name="port">3306</property>
<property name="ipAddress">192.168.43.30</property>
<property name="schema">test</property>
<property name="user">amoeba</property>
<property name="password">123</property>
</factoryConfig>
<poolConfig……>
</poolConfig>
</dbServer><dbServer name="server3">
<factoryConfig……>
<property name="manager">defaultManager</property>
<property name="port">3306</property>
<property name="ipAddress">192.168.43.40</property>
<property name="schema">test</property>
<property name="user">amoeba</property>
<property name="password">123</property>
</factoryConfig>
<poolConfig……>
</poolConfig>
</dbServer><dbServer name="master" virtual="true">
<poolConfig>
……
<property name="poolNames">server1</property>
</poolConfig>
</dbServer><dbServer name="slave" virtual="true">
……
<property name="poolNames">server2,server3</property>
</dbServer></dbServerList>
<queryRouter ……
……
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slave</property>
<property name="needParse">true</property>
</queryRouter>
</amoeba:configuration>
#配置amoeba初始内存
vim /usr/local/amoeba/bin/amoeba
DEFAULT_OPTS="-server -Xms256m-Xmx256m-Xss256k"
#修改128k-256k(48位)
#启动amoeba
nohup bash -x /usr/local/amoeba/bin/amoeba &
#关闭amoeba
ps aux | grep amoeba #查看amoeba进程号
kill -9 2362 #杀死amoeba进程号
#主从服务器中都创建连接中间件的用户
mysql> grant all on *.* to 'amoeba'@'%' identified by '123';
4、检验测试
amoeba服务器下载mysql
yum -y install mysql
mysql -uroot -p 123 -P 8066 -h 192.168.43.10
mysql> use test
mysql> select * from users;
mysql> select * from users;
#会在两台从服务器之间负载均衡mysql> insert into users values (100,"ma");
#写入内容会写入server1,也就是主服务器
1万+

被折叠的 条评论
为什么被折叠?



