redis集群搭建

来源:互联网 发布:电子处方软件 编辑:程序博客网 时间:2024/06/05 01:22

redis:

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、 list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操 作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的 是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。

redis搭建:

redis一主多从环境搭建

redis主从配置比较简单,基本就是在从节点配置文件加上:slaveof 192.168.33.130 6379
主要是通过master server持久化的rdb文件实现的。master server 先dump出内存快照文件,然后将rdb文件传给slave server,slave server 根据rdb文件重建内存表。

redis复制过程如下:
1、slave server启动连接到master server之后,salve server主动发送SYNC命令给master server
2、master server接受SYNC命令之后,判断,是否有正在进行内存快照的子进程,如果有,则等待其结束,否则,fork一个子进程,子进程把内存数据保存为文件,并发送给slave server
3、master server子进程进程做数据快照时,父进程可以继续接收client端请求写数据,此时,父进程把新写入的数据放到待发送缓存队列中
4、slave server 接收内存快照文件之后,清空内存数据,根据接收的快照文件,重建内存表数据结构
5、master server把快照文件发送完毕之后,发送缓存队列中保存的子进程快照期间改变的数据给slave server,slave server做相同处理,保存数据一致性
6、master server 后续接收的数据,都会通过步骤1建立的连接,把数据发送到slave server
需要注意:slave server如果因为网络或其他原因断与master server的连接,当slave server重新连接时,需要重新获取master server的内存快照文件,slave server的数据会自动全部清空,然后再重新建立内存表,这样会让slave server 启动恢复服务比较慢,同时也给master server带来较大压力,可以看出redis的复制没有增量复制的概念,这是redis主从复制的一个主要弊端,在实际环境中,尽量规避中途增加从库
redis2.8之前不支持增量,到2.8之后就支持增量了!
所以本次所用的使3以上的版本

server1 master
server2 slave
server3 slave

server1 主:
安装redis

yum install gcc -y
tar zxf redis-3.0.2.tar.gz ##解压
cd redis-3.0.2
make
make install
/root/redis-3.0.2/utils/install_server.sh ##脚本启动
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] ##配置文件
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] ##日至文件
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service…
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server…
Installation successful!

[root@server1 utils]# redis-cli
127.0.0.1:6379> set name ‘yiyi’
OK
127.0.0.1:6379> get name
“yiyi”
127.0.0.1:6379> quit

server2 server3 从: 操作相同
tar zxf redis-3.0.2.tar.gz ##解压
cd redis-3.0.2
make
make install
/root/redis-3.0.2/utils/install_server.sh ##脚本启动
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] ##配置文件
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] ##日至文件
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service…
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server…
Installation successful!

vim /etc/redis/6379.conf

206 # slaveof
207 slaveof 172.25.14.1 6379 ##主机ip和端口,只允许去连接172.25.14.1的,也可以直接用set在redis-cli里面设置

/etc/init.d/redis_6379 restart ##重启服务
127.0.0.1:6379> get name
“yiyi”
127.0.0.1:6379> CONFIG GET slaveof
1) “slaveof”
2) “172.25.14.1 6379”
127.0.0.1:6379> CONFIG set slaveof 172.25.14.1 6379 ##在redis-cli里面设置配置文件,不过这个是临时的,想要永久必须修改配置文件

redis高可用

解决在单服redis的单点问题。在一个或多个节点出现宕机的情况下,集群内部通过投票的机制能够快速的进行选举和不停机的情况下进行服务持续提供。

三台redis通过sentinel montial 监控对master进行监控,如果有两个slave与master不能进行通信,则认为redismastre宕机,需要进行选举新的master
server1:master
cd redis-3.0.2
cp sentinel.conf /etc/redis/
vim sentinel.conf
5 port 26379
6 daemonize yes ##后台
7 logfile “/var/log/sentinel.log” ##日至文件
54 sentinel monitor mymaster 172.25.14.1 6379 2 ##sentinel监控master主机,起初我们server1是master,所以我们配置里面写172.25.14.1,但是如果server16379down掉之后,就会切换其他从机为主机,配置文件里面的sentinel监控主机的ip会自动修改。 有两个选票认为他坏了 master才算坏了
83 sentinel down-after-milliseconds mymaster 5000 ##
91 sentinel failover-timeout mymaster 60000
116 sentinel config-epoch mymaster 2

scp sentinel.conf 172.25.14.2:/etc/redis/
scp sentinel.conf 172.25.14.3:/etc/redis/

redis-server /etc/redis/sentinel.conf –sentinel ##开启sentinel

[root@server1 redis]# redis-server /etc/redis/sentinel.conf –sentinel
4248:X 25 Jun 10:29:40.775 * Increased maximum number of open files to 10032 (it was originally set to 1024).
.
_.-__ ''-._
_.-
.. ”-. Redis 3.0.2 (00000000/0) 64 bit
.-.-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.
-._|’_.-'| Port: 26379
|
-._ ._ / _.-' | PID: 4248
-._ -._-./ .-’ .-’
|-._-._ -.__.-' _.-'_.-'|
|
-._-._ _.-'_.-' | http://redis.io
-._ -._-._.-‘.-’ _.-’
|-._-._ -.__.-' _.-'_.-'|
|
-._-._ _.-'_.-' |
-._ -._-._.-‘.-’ _.-’
-._-._.-’ .-’
-._ _.-'
-.__.-’

4248:X 25 Jun 10:29:40.778 # Sentinel runid is 643eb1a3a12990266f1867c9239a2f5537b75da9
4248:X 25 Jun 10:29:40.778 # +monitor master mymaster 172.25.14.1 6379 quorum 2
4248:X 25 Jun 10:29:41.778 * +slave slave 172.25.14.2:6379 172.25.14.2 6379 @ mymaster 172.25.14.1 6379
4248:X 25 Jun 10:29:41.791 * +slave slave 172.25.14.3:6379 172.25.14.3 6379 @ mymaster 172.25.14.1 6379

server2和server3:从机
redis-server /etc/redis/sentinel.conf –sentinel ##都打开sentinel
[root@server1 redis]# redis-server /etc/redis/sentinel.conf –sentinel
4248:X 25 Jun 10:29:40.775 * Increased maximum number of open files to 10032 (it was originally set to 1024).
.
_.-__ ''-._
_.-
.. ”-. Redis 3.0.2 (00000000/0) 64 bit
.-.-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.
-._|’_.-'| Port: 26379
|
-._ ._ / _.-' | PID: 4248
-._ -._-./ .-’ .-’
|-._-._ -.__.-' _.-'_.-'|
|
-._-._ _.-'_.-' | http://redis.io
-._ -._-._.-‘.-’ _.-’
|-._-._ -.__.-' _.-'_.-'|
|
-._-._ _.-'_.-' |
-._ -._-._.-‘.-’ _.-’
-._-._.-’ .-’
-._ _.-'
-.__.-’

4248:X 25 Jun 10:29:40.778 # Sentinel runid is 643eb1a3a12990266f1867c9239a2f5537b75da9
4248:X 25 Jun 10:29:40.778 # +monitor master mymaster 172.25.14.1 6379 quorum 2
4248:X 25 Jun 10:29:41.778 * +slave slave 172.25.14.2:6379 172.25.14.2 6379 @ mymaster 172.25.14.1 6379
4248:X 25 Jun 10:29:41.791 * +slave slave 172.25.14.3:6379 172.25.14.3 6379 @ mymaster 172.25.14.1 6379
4248:X 25 Jun 10:31:17.496 * +sentinel sentinel 172.25.14.2:26379 172.25.14.2 26379 @ mymaster 172.25.14.1 6379 ##每开启一个sentinel就会添加一行
4248:X 25 Jun 10:31:32.144 * +sentinel sentinel 172.25.14.3:26379 172.25.14.3 26379 @ mymaster 172.25.14.1 6379

然后切换:

redis-cli -p 6379 -h 172.25.14.1 ##查看server1的redis的信息
info
redis-cli -p 26379 -h 172.25.14.1 ##查看server2的sentinel的信息
info

redis-cli -p 6379 -h 172.25.14.1
shutdown ##down掉master

然后会进行主动切换

我们再连接26379查看master是那台主机。

然后我们打开server1的redis,把server1加入到master中
vim /etc/redis/63..

slaveof 172.25.14.2 6379

redis作为mysql的缓存:

nginx作为客户端,访问php页面,通过php-redis去redis主机上面拿数据,如果redis上面没有的话,那么通过php-mysq去mysql主机上面拿数据,mysql主机将数据set到redis主机上面,这样client端就可以通过访问php页面访问到数据了

但是如果数据库更新的话,数据不能同步到redis主机上面,所以我们需要数据库和redis联动,我们通过gearmand服务端,然后将还有gearman客户端,然后通过worker(php)将数据set到redis主机上面去。这样我们客户端就可以通过访问php页面访问到redis主机上面的数据。

mysql主机通过监听4379gearmand服务器端口,利用json模块函数将数据先转换为json格式的数据,然后通过 gman_do_background 函数选择发送的后端gearmand服务器,最后通过 gman_servers_set函数将数据发送到gearmand服务器,然后gearmand服务器通过worker(php)将数据set到redis主机,方便client访问。

redis是工作在内存空间里面的,所以读的速度非常快,这样可以减轻mysql读的压力

master主机不动,在一个从机上面安装mysql 一个上面安装nginx,php

server2为redis主机,不动

server1为nginx和php主机

server3为mysql主机

server3上面安装 yum install mysql-server -y

server1上面
[root@server1 ~]# yum install nginx-1.8.0-1.el6.ngx.x86_64.rpm php-mysql-5.3.3-38.el6.x86_64.rpm php-fpm-5.3.3-38.el6.x86_64.rpm php-pdo-5.3.3-38.el6.x86_64.rpm php-cli-5.3.3-38.el6.x86_64.rpm php-gd-5.3.3-38.el6.x86_64.rpm php-mbstring-5.3.3-38.el6.x86_64.rpm -y php-common-5.3.3-38.el6.x86_64.rpm ##安装nginx和php

[root@server1 ~]# /etc/init.d/nginx start ##启动
[root@server1 ~]# /etc/init.d/php-fpm start
Starting php-fpm: [ OK ]

vim /etc/php.ini
date.timezone = Asia/Shanghai #设置时区

[root@server1 ~]# vim /etc/php-fpm.d/www.conf

配置nginx

server {listen80;server_name localhost;修改 php-fpm 用户location / {root/usr/share/nginx/html;index index.php index.html index.htm;}location ~ \.php$ {root/usr/share/nginx/html;fastcgi_pass127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME/usr/share/nginx/html/$fastcgi_script_name;includefastcgi_params;}}

service nginx start

测试:

在/usr/share/nginx/html下面写一个php测试页面

然后我们添加php-redis模块和配置数据库:

[root@server1 ~]# yum install php-5.3.3-38.el6.x86_64.rpm ##安装php
[root@server1 ~]# yum install php-devel-5.3.3-38.el6.x86_64.rpm
[root@server1 ~]# cd phpredis-master
[root@server1 phpredis-master]# phpize
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension Api No: 220090626
[root@server1 phpredis-master]# ./configure
make
make install
[root@server1 phpredis-master]# cd /usr/lib64/php/modules/ ##模块所在目录

[root@server1 modules]# cd /etc/php.d/ ##php模块所在目录
[root@server1 php.d]# cp mysql.ini redis.ini
[root@server1 php.d]# vim redis.ini
redis.so
[root@server1 php.d]# /etc/init.d/php-fpm reload
[root@server1 php.d]# php -m | grep redis ##添加到redis模块了
redis

mv test.php /usr/share/nginx/html

<?php        $redis = new Redis();        $redis->connect('172.25.14.2',6379) or die ("could net connect redis server");     ##redis主机ip和端口  #      $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.14.3','redis','westos');      ##数据库ip和端口                        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 ~]# scp test.sql 172.25.14.3: ##将数据库导入到server3中

[root@server3 ~]# mysql < test.sql

mysql> grant all on test.* to redis@’%’ identified by ‘westos’; ##授权,php文件中所写的用户和密码
Query OK, 0 rows affected (0.00 sec)

测试:浏览器中输入172.25.14.1
redis
number is 1
name is test1
number is 2
name is test2
number is 3
name is test3
number is 4
name is test4
number is 5
name is test5
number is 6
name is test6
number is 7
name is test7
number is 8
name is test8
number is 9
name is test9

因为如果修改数据库的数据,同步不到redis上面,所以我们需要数据库和redis的联动

首先在phpserver1上面安装gearmand服务端和gearman客户端

[root@server1 ~]# yum install gearmand-1.1.8-2.el6.x86_64.rpm #安装gearmand
libgearman-1.1.8-2.el6.x86_64.rpm -y
[root@server1 ~]# /etc/init.d/gearmand start ##开启
Starting gearmand: [ OK ]
[root@server1 ~]# netstat -aunlpt | grep :4730
tcp 0 0 0.0.0.0:4730 0.0.0.0:* LISTEN 6937/gearmand
tcp 0 0 :::4730 :::* LISTEN 6937/gearmand
[root@server1 ~]# tar zxf gearman-1.1.2.tgz ##安装gearman
[root@server1 ~]# cd gearman-1.1.2
[root@server1 gearman-1.1.2]# ls
ChangeLog examples php_gearman.h tests
config.m4 LICENSE README test_worker.php
CREDITS php_gearman.c test_client.php
[root@server1 gearman-1.1.2]# phpize ##预编译
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension Api No: 220090626
[root@server1 gearman-1.1.2]# ./configure
make
[root@server1 ~]# yum install libgearman-devel-1.1.8-2.el6.x86_64.rpm -y libevent-devel-1.4.13-4.el6.x86_64.rpm libevent-headers-1.4.13-4.el6.noarch.rpm libevent-doc-1.4.13-4.el6.noarch.rpm ##解决依赖性
make install

[root@server4 php.d]# cp mysql.ini gearman.ini
; Enable mysql extension module
extension=gearman.so
~
[root@server1 php.d]# /etc/init.d/php-fpm reload ##加载php-fpm
Reloading php-fpm: [25-Jun-2017 16:26:36] NOTICE: configuration file /etc/php-fpm.conf test is successful

                                                       [  OK  ]

[root@server1 php.d]# php -m | grep gearman
gearman

[root@server1 ~]# scp gearman-mysql-udf-0.6.tar.gz 172.25.14.3:/root/
root@172.25.14.3’s password:
gearman-mysql-udf-0.6.tar.gz 100% 368KB 368.5KB/s 00:00
[root@server1 ~]# scp lib_mysqludf_json-master.zip 172.25.14.3:/root/
root@172.25.14.3’s password:
lib_mysqludf_json-master.zip 100% 23KB 22.9KB/s 00:00
[root@server1 ~]# scp libgearman-* libevent-* 172.25.14.3:
root@172.25.14.3’s password:
libgearman-1.1.8-2.el6.x86_64.rpm 100% 70KB 69.6KB/s 00:00
libgearman-devel-1.1.8-2.el6.x86_64.rpm 100% 214KB 214.3KB/s 00:00
libevent-1.4.13-4.el6.x86_64.rpm 100% 66KB 65.9KB/s 00:00
libevent-devel-1.4.13-4.el6.x86_64.rpm 100% 74KB 73.9KB/s 00:00
libevent-doc-1.4.13-4.el6.noarch.rpm 100% 194KB 193.8KB/s 00:00
libevent-headers-1.4.13-4.el6.noarch.rpm 100% 30KB 29.8KB/s 00:00

mysql主机server3安装模块函数:

安装 lib_mysqludf_json

[root@server3 gearman-mysql-udf-0.6]# yum install mysql-devel -y
[root@server3 ~]# yum install -y unzip ##解压
unzip lib_mysqludf_json-master.zip
Archive: lib_mysqludf_json-master.zip
37f851c808c4161beb4d5e535771dc0c59c82de6
creating: lib_mysqludf_json-master/
inflating: lib_mysqludf_json-master/README.md
inflating: lib_mysqludf_json-master/lib_mysqludf_json.c
inflating: lib_mysqludf_json-master/lib_mysqludf_json.html
inflating: lib_mysqludf_json-master/lib_mysqludf_json.so
inflating: lib_mysqludf_json-master/lib_mysqludf_json.sql

yum install mysql-devel -y ##安装mysql开发包
[root@server3 lib_mysqludf_json-master]# gcc $(mysql_config –cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

[root@server3 lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin ##拷贝 lib_mysqludf_json.so 模块

注册 UDF 函数(用户自定义函数)
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 |
+————-+—–+———————-+———-+
1 row in set (0.00 sec)

mysql> quit
Bye

安装 gearman-mysql-udf

tar zxf gearman-mysql-udf-0.6.tar.gz
[root@server3 ~]# cd gearman-mysql-udf-0.6
[root@server3 gearman-mysql-udf-0.6]# ./configure –with-mysql=/usr/bin/mysql_config –libdir=/usr/lib64/mysql/plugin/

[root@server3 ~]# ls
gearman-mysql-udf-0.6
gearman-mysql-udf-0.6.tar.gz
libevent-1.4.13-4.el6.x86_64.rpm
libevent-devel-1.4.13-4.el6.x86_64.rpm
libevent-doc-1.4.13-4.el6.noarch.rpm
libevent-headers-1.4.13-4.el6.noarch.rpm
libgearman-1.1.8-2.el6.x86_64.rpm
libgearman-devel-1.1.8-2.el6.x86_64.rpm
lib_mysqludf_json-master
lib_mysqludf_json-master.zip
redis-3.0.2
redis-3.0.2.tar.gz
test.sql
[root@server3 ~]# yum install libgearman-* libevent-* -y ##解决依赖性

make
make install

注册 UDF 函数
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.14.1:4730’); ##geramand服务端口和ip

mysql> SELECT gman_servers_set(‘172.25.14.1:4730’);
+————————————–+
| gman_servers_set(‘172.25.14.1:4730’) |
+————————————–+
| 172.25.14.1:4730 |
+————————————–+
1 row in set (0.00 sec)

编写 mysql 触发器(根据实际情况编写) ##将插入语句注释,打开触发器注释
vim test.sql

use test;DELIMITER $$CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGINSET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as`id`, NEW.name as `name`));END$$DELIMITER ;

mysql < test.sql ##导入数据库

mysql> SHOW TRIGGERS FROM test\G; ##查看触发器
***************** 1. row *****************
Trigger: datatoredis
Event: UPDATE
Table: test
Statement: BEGIN
SET @RECV=gman_do_background(‘syncToRedis’, json_object(NEW.id as id, NEW.name as name));
END
Timing: AFTER
Created: NULL
sql_mode:
Definer: root@localhost
character_set_client: latin1
collation_connection: latin1_swedish_ci
Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)

编写gearman的worker端

vim worker.php

<?php$worker = new GearmanWorker();$worker->addServer();$worker->addFunction('syncToRedis', 'syncToRedis');$redis = new Redis();$redis->connect('172.25.14.2', 6379);              ##redis的ip和端口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); #这条语句就是将 id 作 KEY 和name 作 VALUE 分开存储,需要和前面写的 php 测试代码的存取一致。}?>

nohup php worker.php & ##后台运行php worker

更新 mysql 中的数据
mysql> update test set name=’yiyi’ where id=1;

127.0.0.1:6379> get 1 ##172.25.14.2上面查看redis
“yiyi”

刷新页面测试数据同步:
redis
number is 1
name is yiyi ##redis上面的数据同步过来了
number is 2
name is test2
number is 3
name is test3
number is 4
name is test4
number is 5
name is test5
number is 6
name is test6
number is 7
name is test7
number is 8
name is test8
number is 9
name is test9

原创粉丝点击