假如一个业务场景,测试后,读写比列为1:20,根据读写比例,合理设置优化方案。
读写比列:
写数据/读数据比例, insert/update/delete / select
从“读写分离”概念推导实现基本要素:
一般来说,读服务器就是指写服务器的数据镜像。
从服务器端看:要有N台从服务器和主服务器保持数据一致。
从客户端看:比如有一条insert语句和一条select语句,
则要区分读/写语句,并且分别请求从/主服务器。
服务器端读写分离的具体技术
1:数据库集群技术
集群由3个概念
(1)sql节点 sql node
(2)数据节点 data node
(3)管理节点 ndb managerment
sql语句发送“1sql节点”,“1sql”节点发往“2数据节点”,再由3管理节点完成数据节点之间的同步。
集群技术相对复杂,至少有3种节点,4台服务器才能完成。
2,数据库复制
写/master(0) 同步 读/slave(1)
3,数据库复制replication的实现原理
(1)主服务器凡运行语句,都产生一个二进制日志 binlog
(2)从服务器不断读取主服务器的binlog
(3)从服务器读取到的binlog,转换为自身可执行的relaylog
(4)执行relaylog
4,实现步骤:
(1)首先确保主服务器打开二进制日志功能
这样,主服务器一旦有数据变化,立即产生二进制日志
(2)从服务器也需要开启二进制日志和relay日志功能
这样可以从主服务器读取binlog,并产生relaylog
(3)在主服务器建立一个从服务器的账号,并授予最高权限
(4)指定从服务器对应的主服务器,开启从服务器
具体实施
假如一台虚拟机xp,和一台linux
(1)在虚拟机xp下安装mysql作为从服务器
(2)在linux下编译mysql,作为主服务器
(3)保证xp与linux的3306端口互通
(4)配置主服务器,打开binlog
mysql>show master status;
Empty set (0.00 sec)
#开启二进制日志
log-bin=mysql-bin
#给服务器起一个唯一的id
serve-id=1
#指定日志格式
binlog-format=mixd/row/statement
重启mysql
mysql>show master status;
会多两个文件:mysql-bin.000001和mysql-bin.index
已经能够充当master服务器
5,配置从服务器打开binlog和relaylog
mysql>show slave status;
Empty set (0.00 sec)
[mysql]
#slave config
log_bin =mysql-bin
server_id =2
relay_log =mysql-relay-bin
log_slave_updates =1
read_only =1
重启从服务器
6,在主服务器上创建相应的复制账号
mysql>grant replication slave,replication client
->on *.*
->to repl@‘192.168.2.%‘ identified by ‘111111‘;
Query OK, 0 rows affected (0.02 sec)
mysql>flush privileges;
Query OK,0 rows affected (0.00 sec)
7,在从服务器通过语句指定要复制的主服务器(注意,可以一主多从,不可以一从多主)
mysql>change master to
->master_host=‘192.168.2.99‘,(主服务器ip)
->master_user=‘repl‘,
->master_password=‘111111‘,
->master_log_file=‘mysql-bin.000001‘,
->master_log_pos=0;
Query OK, 0 rows affected (0.08 sec)
8,启动从服务器功能
->start slave;
9,测试
如何在客户端应用的时候,路由语句
一般用两种方法
(1)直接在PHP的mysql类做判断,最简单,不用额外加软件
比如discuz论坛。
代码:
//下面这个mysql类,不仅仅是一个mysql类,还充当一个sql语句的路由功能。
class mysql{
$dbm=主服务器;
$dbs1=从服务器1;
$dbs2=从服务器2;
public function query(){
在query里面进行语句判断
分别连接不同的mysql服务器
}
}
new mysql
mysql->query();
(2)用集群中间件
比如官方的mysql_proxy,还有国产的中间件amoeba