1.lamp架构下
[root@server1 redis]# yum install nginx-1.8.0-1.el6.ngx.x86_64.rpm -y
[root@server1 redis]# yum install php-* -y
[root@server1 redis]# /etc/init.d/php-fpm start
[root@server1 redis]# cd /etc/nginx/
[root@server1 nginx]# vim nginx.conf
user apache;
worker_processes 1;
[root@server1 nginx]# cd conf.d/
[root@server1 conf.d]# vim default.conf
******************************************
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/$fastcgi_script_name;
include fastcgi_params;
}
******************************************
[root@server1 conf.d]# /etc/init.d/nginx start
[root@server1 conf.d]# cd /usr/share/nginx/html/
[root@server1 html]# vim index.php
<?php
phpinfo()
?>
[root@server1 html]# vim /etc/php.ini
[Date]
; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = Asia/Shanghai
[root@server1 html]# /etc/init.d/php-fpm reload
[root@server1 redis]# unzip phpredis-master.zip
[root@server1 redis]# cd phpredis-master
[root@server1 phpredis-master]# phpize
[root@server1 phpredis-master]# yum install gcc* -y
[root@server1 phpredis-master]# ./configure --enable-redis
[root@server1 phpredis-master]# make
[root@server1 phpredis-master]# make install
[root@server1 phpredis-master]# cd /usr/lib64/php/modules/
[root@server1 modules]# cd /etc/php.d/
[root@server1 php.d]# cp mysql.ini redis.ini
[root@server1 php.d]# vim redis.ini
extension=redis.so
[root@server1 php.d]# php -m | grep redis
redis
[root@server1 php.d]# /etc/init.d/php-fpm reload
[root@server2 ~]# yum install mysql-server -y
[root@server1 redis]# scp redis-4.0.8.tar.gz server2:
[root@server1 redis]# scp redis-4.0.8.tar.gz server3:
2.redis安装(server1,server2同样安装)
[root@server3 ~]# tar zxf redis-4.0.8.tar.gz
[root@server3 ~]# cd redis-4.0.8
[root@server3 redis-4.0.8]# make
[root@server3 redis-4.0.8]# make install
[root@server3 redis-4.0.8]# cd utils/
[root@server3 utils]# ./install_server.sh ##自动安装配置
[root@server3 utils]# cd /etc/redis/
[root@server3 redis]# vim 6379.conf
bind 0.0.0.0
[root@server3 redis]# /etc/init.d/redis_6379 restart
[root@server3 redis]# redis-cli ##基础操作
127.0.0.1:6379> set name westos
OK
127.0.0.1:6379> get name
"westos"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> CONFIG GET * ##显示所有指令
93) "slave-announce-port"
94) "0"
95) "min-slaves-to-write"
96) "0"
97) "min-slaves-max-lag"
98) "10"
127.0.0.1:6379> CONFIG set min-slaves-to-write 1 ##
[root@server1 redis]# sysctl -a | grep vm.over
vm.overcommit_memory = 0 ##
vm.overcommit_ratio = 50
[root@server1 redis]# sysctl vm.overcommit_memory
vm.overcommit_memory = 0
[root@server1 redis]# sysctl -w vm.overcommit_memory=1 | 2
[root@server1 redis]# vim 6379.conf
bind 0.0.0.0 ##监听全局
slaveof 172.25.18.3 6379 ##从属于172.25.18.3 6379
[root@server2 redis]# vim 6379.conf
bind 0.0.0.0 ##监听全局
slaveof 172.25.18.3 6379 ##从属于172.25.18.3 6379
测试:
server3上set数据
server1,server2上同步显示
3.
[root@server3 redis-4.0.8]# cp sentinel.conf /etc/redis/
[root@server3 redis]# vim sentinel.conf
protected-mode no ##关闭保护
sentinel monitor mymaster 172.25.18.2 6379 2 ##设置主master
sentinel down-after-milliseconds mymaster 5000 ##时间5s
sentinel failover-timeout mymaster 5000 ##时间5s
[root@server3 redis]# scp sentinel.conf server1:/etc/redis/
[root@server3 redis]# scp sentinel.conf server2:/etc/redis/
[root@server1 redis]# redis-sentinal /etc/redis/sentinel.conf ##一定要在分发完毕后再启动
[root@server2 redis]# redis-sentinal /etc/redis/sentinel.conf
[root@server3 redis]# redis-sentinal /etc/redis/sentinel.conf
此时三台主机都同步缓存了,server3为master,server1,server2为slave
重新连接一个server3
[root@server3 ~]# redis-cli
127.0.0.1:6379> info ##查看具体参数
127.0.0.1:6379> shutdown ##关闭服务进程
经info查看,竞选server1为master
server3需手动启动,并添加slaveof指向server1
[root@server3 ~]# vim /etc/redis/6379.conf
slaveof 172.25.18.1 6379
[root@server3 ~]# /etc/init.d/redis_6379 restart
server1,server2全部关闭redis,并取消开机自起
[root@server3 redis]# vim /etc/redis/6379.conf
******************************************************************************
#slaveof 172.25.18.1 6379
[root@server1 redis]# vim test.php
<?php
$redis = new Redis();
$redis->connect('172.25.18.3',6379) or die ("could net connect redis server");
# $query = "select * from test limit 9";
$query = "select * from test";
for ($key = 1; $key < 10; $key++)
{
if (!$redis->get($key))
{
$connect = mysql_connect('172.25.18.2','redis','westos');
mysql_select_db(test);
$result = mysql_query($query);
//如果没有找到$key,就将该查询sql的结果缓存到redis
while ($row = mysql_fetch_assoc($result))
{
$redis->set($row['id'],$row['name']);
}
$myserver = 'mysql';
break;
}
else
{
$myserver = "redis";
$data[$key] = $redis->get($key);
}
}
echo $myserver;
echo "<br>";
for ($key = 1; $key < 10; $key++)
{
echo "number is <b><font color=#FF0000>$key</font></b>";
echo "<br>";
echo "name is <b><font color=#FF0000>$data[$key]</font></b>";
echo "<br>";
}
?>
******************************************************************************
[root@server1 redis]# cp test.php /usr/share/nginx/html/
[root@server2 ~]# mysql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
mysql> grant all on test.* to redis@'%' identified by 'westos';
[root@server1 redis]# scp test.sql server2:~
[root@server2 ~]# mysql < test.sql
client -> r/w redis -> mysql
client -> gearmand -> worker
[root@server1 redis]# yum install gearmand-1.1.8-2.el6.x86_64.rpm libgearman-1.1.8-2.el6.x86_64.rpm libgearman-devel-1.1.8-2.el6.x86_64.rpm libevent-devel-1.4.13-4.el6.x86_64.rpm libevent-* -y
[root@server1 redis]# /etc/init.d/gearmand start
[root@server1 redis]# scp gearman-mysql-udf-0.6.tar.gz lib_mysqludf_json-master.zip server2:
[root@server2 ~]# yum install mysql-devel -y
[root@server2 ~]# unzip lib_mysqludf_json-master.zip
[root@server2 ~]# cd lib_mysqludf_json-master
[root@server2 lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
[root@server2 lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
[root@server2 lib_mysqludf_json-master]# cat lib_mysqludf_json.sql
[root@server2 lib_mysqludf_json-master]# mysql
mysql> create function json_object returns string soname 'lib_mysqludf_json.so';
mysql> select * from mysql.func;
+-------------+-----+----------------------+----------+
| name | ret | dl | type |
+-------------+-----+----------------------+----------+
| json_object | 0 | lib_mysqludf_json.so | function |
+-------------+-----+----------------------+----------+
[root@server1 redis]# scp libgearman-* libevent-* server2:
[root@server2 ~]# yum install -y libgearman-* libevent-*
[root@server2 ~]# tar zxf gearman-mysql-udf-0.6.tar.gz
[root@server2 ~]# cd gearman-mysql-udf-0.6
[root@server2 gearman-mysql-udf-0.6]# ./configure --with-mysql --libdir=/usr/lib64/mysql/plugin/
[root@server2 gearman-mysql-udf-0.6]# make && make install
[root@server2 gearman-mysql-udf-0.6]# cd /usr/lib64/mysql/plugin/
[root@server2 plugin]# ll libgearman_mysql_udf.so
lrwxrwxrwx 1 root root 29 Apr 25 15:38 libgearman_mysql_udf.so -> libgearman_mysql_udf.so.0.0.0
mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so';
mysql> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';
mysql> select * from mysql.func;
+--------------------+-----+-------------------------+----------+
| name | ret | dl | type |
+--------------------+-----+-------------------------+----------+
| json_object | 0 | lib_mysqludf_json.so | function |
| gman_do_background | 0 | libgearman_mysql_udf.so | function |
| gman_servers_set | 0 | libgearman_mysql_udf.so | function |
+--------------------+-----+-------------------------+----------+
mysql> SELECT gman_servers_set('172.25.18.1:4730');
+--------------------------------------+
| gman_servers_set('172.25.18.1:4730') |
+--------------------------------------+
| 172.25.18.1:4730 |
+--------------------------------------+
[root@server2 ~]# vim test.sql
************************************************************
use test;
#CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');
DELIMITER $$
CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN
SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`));
END$$
DELIMITER ;
************************************************************
[root@server2 ~]# mysql < test.sql
[root@server1 redis]# tar zxf gearman-1.1.2.tgz
[root@server1 redis]# cd gearman-1.1.2
[root@server1 gearman-1.1.2]# phpize
[root@server1 gearman-1.1.2]# ./configure
[root@server1 gearman-1.1.2]# make && make install
[root@server1 gearman-1.1.2]# cd /etc/php.d/
[root@server1 php.d]# cp redis.ini gearman.ini
[root@server1 php.d]# vim gearman.ini
extension=gearman.so
[root@server1 php.d]# /etc/init.d/php-fpm reload
[root@server1 php.d]# php -m | grep gearman
[root@server1 redis]# cp worker.php /usr/local/
[root@server1 redis]# cd /usr/local/
[root@server1 local]# vim worker.php
************************************************
<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');
$redis = new Redis();
$redis->connect('172.25.18.3', 6379);
while($worker->work());
function syncToRedis($job)
{
global $redis;
$workString = $job->workload();
$work = json_decode($workString);
if(!isset($work->id)){
return false;
}
$redis->set($work->id, $work->name);
}
?>
************************************************
[root@server1 local]# nohup php worker.php &
测试:
浏览器上访问
http://172.25.18.1/test.php
在数据库里更新,redis端同样更新
mysql> update test set name='devin' where id='1';
模型:
client : mysql -> update -> trigger -> gearman-utf
| -> json-utf
|
|
gearmand : server:4730
|
|
|
worker : php -> redis sync: redis:6379
-> gearman
一些mysql的操作
mysql> show variables like '%slow%'; ##慢缓存
+---------------------------+---------------------------------+
| Variable_name | Value |
+---------------------------+---------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/server1-slow.log |
+---------------------------+---------------------------------+
mysql> set global slow_query_log=1; ##开启慢缓存
Query OK, 0 rows affected (0.00 sec)
mysql> select sleep(10); ##休眠10s,测试慢缓存
+-----------+
| sleep(10) |
+-----------+
| 0 |
+-----------+
mysql> show variables like '%query%';
+------------------------------+---------------------------------+
| Variable_name | Value |
+------------------------------+---------------------------------+
| binlog_rows_query_log_events | OFF |
| ft_query_expansion_limit | 20 |
| have_query_cache | YES |
| long_query_time | 10.000000 |
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1048576 |
| query_cache_type | OFF |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/server1-slow.log |
+------------------------------+---------------------------------+
mysql> show status like '%slow%';
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| Slow_launch_threads | 0 |
| Slow_queries | 1 |
+---------------------+-------+
mysql> show variables like '%indexes%';
+----------------------------------------+-------+
| Variable_name | Value |
+----------------------------------------+-------+
| log_queries_not_using_indexes | OFF |
| log_throttle_queries_not_using_indexes | 0 |
+----------------------------------------+-------+
mysql> show variables like '%binlog%';
+-----------------------------------------+----------------------+
| Variable_name | Value |
+-----------------------------------------+----------------------+
| binlog_cache_size | 32768 |
| binlog_checksum | CRC32 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_error_action | ABORT_SERVER |
| binlog_format | ROW |
| binlog_group_commit_sync_delay | 0 |
| binlog_group_commit_sync_no_delay_count | 0 |
| binlog_gtid_simple_recovery | ON |
| binlog_max_flush_queue_time | 0 |
| binlog_order_commits | ON |
| binlog_row_image | FULL |
| binlog_rows_query_log_events | OFF |
| binlog_stmt_cache_size | 32768 |
| innodb_api_enable_binlog | OFF |
| innodb_locks_unsafe_for_binlog | OFF |
| log_statements_unsafe_for_binlog | ON |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 1073741824 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| sync_binlog | 1 |
+-----------------------------------------+----------------------+
mysql的bin_log的三种模式
Statement:
优点:记录的简单,内容少
缺点:导致主从不一致
例:
100w条记录
updatetest set name=’tintin’;
binilog 里面就只用update test set name=’tintin’;
ROW 行级模式
优点:记录数据详细(每行),主从一直
缺点:占用大量的磁盘空间,降低了磁盘的性能
100w条记录
updatetest set name=’tintin’;
binilog 里面就用100w条update test set name=’tintin’;语句
MIXED混合模式
100w条记录
updatetest set name=’tintin’;
binilog 里面就只用update test set name=’tintin’;
对于函数,触发器,存储过程
会自动的使用row-level模式
RBR 的优点:
任何情况都可以被复制,这对复制来说是最安全可靠的
和其他大多数数据库系统的复制技术一样
多数情况下,从服务器上的表如果有主键的话,复制就会快了很多
复制以下几种语句时的行锁更少:
* INSERT ... SELECT
* 包含 AUTO_INCREMENT 字段的 INSERT
* 没有附带条件或者并没有修改很多记录的 UPDATE 或 DELETE 语句
执行 INSERT,UPDATE,DELETE 语句时锁更少
从服务器上采用多线程来执行复制成为可能
RBR 的缺点:
binlog 大了很多
复杂的回滚时 binlog 中会包含大量的数据
主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而 SBR 只会写一次,这会导致频繁发生 binlog 的并发写问题
UDF 产生的大 BLOB 值会导致复制变慢
无法从 binlog 中看到都复制了写什么语句
当在非事务表上执行一段堆积的SQL语句时,最好采用 SBR 模式,否则很容易导致主从服务器的数据不一致情况发生
mysql> show variables like '%days%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| expire_logs_days | 0 |
+------------------+-------+
mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 461 |
| mysql-bin.000002 | 194 |
| mysql-bin.000003 | 194 |
| mysql-bin.000004 | 194 |
| mysql-bin.000005 | 194 |
| mysql-bin.000006 | 194 |
+------------------+-----------+
mysql> show slave hosts;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID |
+-----------+------+------+-----------+--------------------------------------+
| 2 | | 3306 | 1 | e3a4c699-4805-11e8-9ea5-52540055d374 |
+-----------+------+------+-----------+--------------------------------------+