1.lamp架构下
[root
@server1 redis]
[root
@server1 redis]
[root
@server1 redis]
[root
@server1 redis]
[root
@server1 nginx]
user apache;
worker_processes
1;
[root
@server1 nginx]
[root
@server1 conf.d]
******************************************
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]
[root
@server1 conf.d]
[root
@server1 html]
<?php
phpinfo()
?>
[root
@server1 html]
[Date]
; Defines the default timezone used by the date functions
; http:
//www.php.net/manual/en/datetime.configuration.php
date.timezone = Asia/Shanghai
[root
@server1 html]
[root
@server1 redis]
[root
@server1 redis]
[root
@server1 phpredis-master]
[root
@server1 phpredis-master]
[root
@server1 phpredis-master]
[root
@server1 phpredis-master]
[root
@server1 phpredis-master]
[root
@server1 phpredis-master]
[root
@server1 modules]
[root
@server1 php.d]
[root
@server1 php.d]
extension=redis.so
[root
@server1 php.d]
redis
[root
@server1 php.d]
[root
@server2 ~]
[root
@server1 redis]
[root
@server1 redis]
2.redis安装(server1,server2同样安装)
[root
@server3 ~]
[root
@server3 ~]
[root
@server3 redis-
4.0.
8]
[root
@server3 redis-
4.0.
8]
[root
@server3 redis-
4.0.
8]
[root
@server3 utils]
[root
@server3 utils]
[root
@server3 redis]
bind 0.
0.
0.
0
[root
@server3 redis]
[root
@server3 redis]
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]
vm.overcommit_memory =
0
vm.overcommit_ratio =
50
[root
@server1 redis]
vm.overcommit_memory =
0
[root
@server1 redis]
[root
@server1 redis]
bind 0.
0.
0.
0
slaveof
172.25.
18.3 6379
[root
@server2 redis]
bind 0.
0.
0.
0
slaveof
172.25.
18.3 6379
测试:
server3上set数据
server1,server2上同步显示
3.
[root
@server3 redis-
4.0.
8]
[root
@server3 redis]
protected-mode
no
sentinel monitor mymaster
172.25.
18.2 6379 2
sentinel down-after-milliseconds mymaster
5000
sentinel failover-timeout mymaster
5000
[root
@server3 redis]
[root
@server3 redis]
[root
@server1 redis]
[root
@server2 redis]
[root
@server3 redis]
此时三台主机都同步缓存了,server3为master,server1,server2为slave
重新连接一个server3
[root
@server3 ~]
127.0.
0.
1:
6379> info
127.0.
0.
1:
6379>
shutdown
经info查看,竞选server1为master
server3需手动启动,并添加slaveof指向server1
[root
@server3 ~]
slaveof
172.25.
18.1 6379
[root
@server3 ~]
server1,server2全部关闭redis,并取消开机自起
[root
@server3 redis]
******************************************************************************
[root
@server1 redis]
<?php
$redis = new Redis();
$redis->
connect(
'172.25.18.3',
6379)
or die (
"could net connect redis server");
$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]
[root
@server2 ~]
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
mysql> grant all on test.* to redis
@'%' identified by
'westos';
[root
@server1 redis]
[root
@server2 ~]
client -> r/w redis -> mysql
client -> gearmand -> worker
[root
@server1 redis]
[root
@server1 redis]
[root
@server1 redis]
[root
@server2 ~]
[root
@server2 ~]
[root
@server2 ~]
[root
@server2 lib_mysqludf_json-master]
[root
@server2 lib_mysqludf_json-master]
[root
@server2 lib_mysqludf_json-master]
[root
@server2 lib_mysqludf_json-master]
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]
[root
@server2 ~]
[root
@server2 ~]
[root
@server2 ~]
[root
@server2 gearman-mysql-udf-
0.
6]
[root
@server2 gearman-mysql-udf-
0.
6]
[root
@server2 gearman-mysql-udf-
0.
6]
[root
@server2 plugin]
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 ~]
************************************************************
use test;
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 ~]
[root
@server1 redis]
[root
@server1 redis]
[root
@server1 gearman-
1.1.
2]
[root
@server1 gearman-
1.1.
2]
[root
@server1 gearman-
1.1.
2]
[root
@server1 gearman-
1.1.
2]
[root
@server1 php.d]
[root
@server1 php.d]
extension=gearman.so
[root
@server1 php.d]
[root
@server1 php.d]
[root
@server1 redis]
[root
@server1 redis]
[root
@server1 local]
************************************************
<?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]
测试:
浏览器上访问
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的操作
| log
_slow_admin
_statements | OFF |
| log_slow
_slave_statements | OFF |
| slow
_launch_time | 2 |
| slow
_query_log | OFF |
mysql> set global slow
_query_log=1; ##开启慢缓存
Query OK, 0 rows affected (0.00 sec)
| 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 |
+------------------------------+---------------------------------+
| Slow
_launch_threads | 0 |
| log
_queries_not
_using_indexes | OFF |
| 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 模式,否则很容易导致主从服务器的数据不一致情况发生