前言:
MySQL数据库现在用的越来越牛逼了,但是,性能这一块出了很大的问题,如果一张表有几千万甚至几亿的数据的话,那么就会很缓慢。如果有连表的话,那就慢的想骂街了。
所以,这个时候,读写分离出现了。
准确的说就是,把读操作和写操作分来,因为,慢,主要是读很慢,也就是select 很慢。
用两台一模一样的MySQL数据库服务器。一台我们称作master,主服务器;一台我们称作slave,从服务器。然后,数据都往master里写,然后同步到slave里面;再所有的查询就从slave 里面。这样。就形成了读写分离,速度加快了很多。
1. 先说说虚拟机VW 和Ubuntu系统
一般个人学习的话,肯定是虚拟机上面安装Linux系统的,我个人比较喜欢Ubuntu,大小700多M,而且对于新手来说安装软件很爽,apt-get install xxxx,就搞定了,
所以,这次也是在Ubuntu上完成的。
一,安装Ubuntu操作系统
因为我是笔记本,用的无线网,没有网线,所以网络选择VMnet8 ,选择软件的时候,全部勾选开发软件,下一步,默认自动分区,安装完成,称作master服务器
然后clone 一台,称作slave 服务器。也是网卡模式选择VMnet8。
这样两台虚拟机和本机win7就可以通讯了,不过本机的ip是VM net8 的,如图:
这样,三台机器就可以互通了,本机win7 192。168.15.1 ,master 192.168.15.131,slave 192.168.15.133
二,安装Lamp环境
一些新手,比如我,对源代码安装Lamp安装不爽,安装很多遍,都不成功,特别是php。在Ubuntu里安装很爽了,一键安装。
tasksel:新德利软件包。
sudo tasksel install lamp-server
或者:
sudo tasksel
然后在tasksel界面中选LAMP-Server就OK了。
安装过程中会提示你输入mysql的root密码。
OK,安装完成了,现在你可以运行apache2来启动apache了,然后在浏览器里输入127.0.0.1,看看是不是已经显示测试页面了?
http://hi.baidu.com/yangyiphper/item/30bae2db358dddf954347f29
http://hi.baidu.com/yangyiphper/item/89bc6f35db195789b80c0329
三,Lamp的各个配置文件的路径
用tasksel 安装的都是默认安装的各个软件。所以,一定要搞清楚各个软件的安装目录。
1,PHP的web目录:/var/www/
2,php 的配置文件:/etc/php5/apache2/php.ini
看看截图:
/etc/php5/apache2/php.ini 是php web运行的配置文件,
/etc/php5/cli/php.ini 是php cli 方式运行的配置文件,命令行运行。
/etc/php5/conf.d/目录下是php的各个扩展的配置文件。
/etc/apache2/apache2.conf
配置都是分开的,这里就不细说了。http://blog.csdn.net/jibcy/article/details/8060651
4 . MySQL 的配置目录
/etc/mysql/my.cnf 配置文件。
/var/lib/mysql/ datadir目录,需要root权限才能看
/var/log/mysql/ mysql 的bin-log日志和错误日志目录。
/usr/bin/mysql,、usr/bin/mysqlbinlog mysql的各个命令的目录。
四,Lamp 各个组件的重启命令
sudo /etc/init.d/mysql restart MySQL重启
sudo /etc/init.d/apache2 restart Apache重启
sudo /etc/init.d/networking restart 网络重启
2. Mysql 用户授权
要做主从复制,就要先用户授权,因为,slave 服务器要从master 服务器的bin-log 数据同步,那么slave 就要能够登录master服务器。那么就要授权
mysql 数据库中用户授权命令:grant 关键字、
我们先登录master 服务器:192.168.15.131 。
yangyi@yangyi:~$ mysql -uroot -p123456 -h192.168.15.131
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.15.131' (111)
为什么出现这样的错误呢?192.168.15.131 可以本机的ip啊?这个ip为什么登陆不上?
后来百度说Ubuntu上面安装的mysql 为了安全,只允许ip 为127.0.0.1 的ip登录,我们试一试:
成功了!
那要怎么改一改呢:
vi /etc/mysql/my.cnf
将bin-address = 0.0.0.0 这样在本机就可以用任意ip 登录了。保存重启mysql 数据库。
然后我们再试一试:恩,成功了。用本机的ip 登录成功了。
将master和slave的mysq配置同时修改一下。将bin-address = 0.0.0.0
一,用slave mysql服务器来登录master 服务器。
现在master 服务器可以用ip 登录了,那现在从slave 服务器去登陆一下master。
slave 的ip是192.168.15.133 。试一下
yangyi@yangyi:~$ mysql -uroot -p123456 -h192.168.15.131
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.15.131' (111)
登录不上,说明还没授权。
现在去master 服务器上去授权slave 的ip
yangyi@yangyi:~$ mysql -uroot -p123456 -h192.168.15.131
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 71
Server version: 5.1.61-0ubuntu0.10.10.1-log (Ubuntu)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select user,host,password from mysql.user;
+------------------+-----------+-------------------------------------------+
| user | host | password |
+------------------+-----------+-------------------------------------------+
| root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | yangyi | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | 127.0.0.1 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| debian-sys-maint | localhost | *36EACFFD831A44B49F2EBE61790385BF76F49337 |
| phpmyadmin | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+------------------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)
mysql数据库的user表是授权表,是可以登录数据库的授权用户,那么如何将slave 的ip 192.168.15.133 放进去呢?
这个时候就用到grant 关键字了,这个是专门用来授权的。
怎么用呢。
mysql> ? grant
这样可以看它的用法。
我们就不讲这么细了,直接来:
mysql> grant all on *.* to 'yangyi'@192.168.15.133 identified by '123456';
Query OK, 0 rows affected (0.00 sec)
给slave 服务器192.168.15.133 的用户为yangyi,密码为123456 的用户授权。注意,用户名和密码要用单引号。grant all 表示所有的权限。这个以后讲
我们再看看user 表
mysql> select user,host,password from mysql.user;
+------------------+-----------+-------------------------------------------+
| user | host | password |
+------------------+-----------+-------------------------------------------+
| root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | yangyi | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | 127.0.0.1 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| debian-sys-maint | localhost | *36EACFFD831A44B49F2EBE61790385BF76F49337 |
| yangyi | 192.168.15.131 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+------------------+-----------+-------------------------------------------+
授权成功。
现在去slave 服务器192.168.15.133登录master试一试,看能不能登陆进去
yangyi@yangyi:~$ mysql -uyangyi -p123456 -h192.168.15.131
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 70
Server version: 5.1.61-0ubuntu0.10.10.1-log (Ubuntu)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
登录成功!
二,熟悉bin-log 日志
bin-log 日志对于数据同步,主从复制极为关键,这也是为什么要讲的原因。
1.开启bin_log 日志配置:vi /etc/mysql/my.cnf 92行,log_bin 开启,也就是把前面的#去掉,
就可以从/var/log/mysql 看到mysql_bin.000000日志了。
mysql>show variables like '%bin%';
看到log_bin ON 说明也是开启了。
mysql>flush logs;
从当前位置开始,生成一个新的mysql-bin日志,会自增变成mysql-bin.000011了。
show master status;
就可以看到最新的,或者最后的一个mysql-bin日志,也就是刚才的mysql-bin.000011了,position 从106开始的。
mysql>reset master
清空所有的mysql-bin 日志,进去var/log/mysql 里看,会发现其他的都没有了。只有mysql-bin.000001和
mysql-bin.index 这两个是mysql最基本的日志,清不掉的。
mysql>\s
查看mysql 状态
/usr/bin/mysqlbinlog --no-defaults mysql-000001.bin |more
会看见的增删改都会记录下来了。
恢复mysql数据
/usr/bin/mysqlbinlog --start-position='112' --stop-position='554' --no-defaults mysql-000001.bin | mysql -uroot -p123456 test
2.查看mysql datadir ,可以vi /etc/mysql/my.cnf 46行。看出datadir=/var/lib/mysql。但是普
通用户没有权限查看,切换到root用户就可以进入/var/lib/mysql目录下看了。