龔哥哥 愛生活、做自己!
商城系統中商品規格使用笛卡爾積運算
發表于 2019-9-22 | 瀏覽(2618) | 前端
/**
 * 笛卡爾積生成規格
 * @author   Devil
 * @blog     http://gong.gg/
 * @version  1.0.0
 * @datetime 2019-09-22T00:33:48+0800
 * @desc     description
 * @param    {[array]}                 arr1 [要進行笛卡爾積的二維數組]
 * @param    {[array]}                 arr2 [最終實現的笛卡爾積組合,可不寫]
 */
function SpecCartesian(arr1, arr2)
{
    // 去除第一個元素
    var result = [];
    var temp_arr = arr1;
    var first = temp_arr.splice(0, 1);

    if((arr2 || null) == null)
    {
        arr2 = [];
    }

    // 判斷是否是第一次進行拼接
    if(arr2.length > 0)
    {
        for(var i in arr2)
        {
            for(var k in first[0].value)
            {
                result.push(arr2[i]+','+first[0].value[k]);
            }
        }
    } else {
        for(var i in first[0].value)
        {
            result.push(first[0].value[i]);
        }
    }

    // 遞歸進行拼接
    if(arr1.length > 0)
    {
        result = SpecCartesian(arr1, result);
    }

    // 返回最終笛卡爾積
    return result;
}


// 自動生成規格
var spec = [
    {
        "title": "顏色",
        "value": ["黑色", "白色", "藍色"]
    },
    {
        "title": "尺碼",
        "value": ["S", "M", "L", "XL", "XXL"]
    },
    {
        "title": "長度",
        "value": ["5分褲", "7分褲", "9分褲", "長褲"]
    }
];
var data = SpecCartesian(spec);
console.log(data);

效果圖

Image

閱讀全文

ShopXO國內領先企業級B2C免費開源電商系統
發表于 2019-3-29 | 瀏覽(9254) | 開源項目

ShopXO 國內領先企業級B2C免費開源電商系統!

  • 求實進取、創新專注、自主研發、國內領先企業級B2C電商系統解決方案。
  • 遵循Apache2開源協議發布,并提供免費使用。
  • PC+WAP、支付寶小程序、微信小程序、百度小程序。

傳送門

小程序體驗碼

微信小程序

安裝教程

官方QQ群

  • 群號:833531593
  • 答案:shopxo.net

源代碼平臺

擴展性

  • 獨立模塊式開發,完善的注釋,易擴展,應用管理。

安全性

  • 防止sql注入,代碼高安全性。

輕量級,高性能

  • 支持多數據庫,讀寫分離,高并發,內置緩存機制。

后端基于ThinkPHP v5.1

ThinkPHP是一個快速、簡單的基于MVC和面向對象的輕量級PHP開發框架,遵循Apache2開源協議發布,從誕生以來一直秉承簡潔實用的設計原則,在保持出色的性能和至簡的代碼的同時,尤其注重開發體驗和易用性,并且擁有眾多的原創功能和特性,為WEB應用開發提供了強有力的支持。

前端基于AmazeUI v2.7.2

組件豐富,模塊化

      以移動優先(Mobile first)為理念,從小屏逐步擴展到大屏,最終實現所有屏幕適配,適應移動互聯潮流。

本地化支持

      相比國外框架,Amaze UI 關注中文排版,根據用戶代理調整字體,實現更好的中文排版效果;兼顧國內主流瀏覽器及 App 內置瀏覽器兼容支持。

輕量級,高性能

      Amaze UI 面向 HTML5 開發,使用 CSS3 來做動畫交互,平滑、高效,更適合移動設備,讓 Web 應用更快速載入。

小程序圖片展示(微信、支付寶)

小程序

PC端圖片展示

電腦端

后臺管理圖片展示

后臺管理

如何貢獻

非常歡迎您對ShopXO的開發作出貢獻! 你可以選擇以下方式向ShopXO貢獻:

開源協議

Apache License Version 2.0 see http://www.apache.org/licenses/LICENSE-2.0.html

閱讀全文

魔鬼部署系統搭建 Nginx+Uwsgi+Django
發表于 2017-8-23 | 瀏覽(17313) | 開源項目

效果圖

Image

流程圖

Image

項目地址

https://github.com/gongfuxiang/mogui

https://coding.net/u/gongfuxiang/p/mogui/git


其它相關可參考本博客中的其它文章

1、nginx
2、git ssh部署
3、mysql

基礎信息

系統         CentOS7(7.3.1611)
Python      2.7.5
Django      1.11.3
Vue         2.4.0
Element     1.4.2

centos6自帶python 2.4.3, 我們也可以升級到python2.7.13(這一步可跳過)

https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz
tar -zxvf Python-2.7.13.tgz
cd Python-2.7.13
./configure --prefix=/usr/local
make && make altinstall

安裝setuptools

wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz
tar -zxvf setuptools-0.6c11.tar.gz
cd setuptools-0.6c11
python setup.py build
python setup.py install

安裝pip

wget https://pypi.python.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz
tar -zxvf pip-9.0.1.tar.gz
cd pip-9.0.1
python setup.py install

安裝python-devel

yum -y install python-devel
yum -y install sqlite-devel

pip安裝uwsgi

pip install uwsgi

測試uwsgi是否正常運行 創建 test.py 文件

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World"

uwsgi --http :8008 --wsgi-file test.py
在瀏覽器內輸入:http://127.0.0.1:8008,查看是否有"Hello World"輸出,若沒有輸出,請檢查你的安裝過程。

pip安裝django

pip install django==1.11.3

測試 django 是否正常,運行

django-admin.py startproject hello
cd hello
python manage.py runserver 0.0.0.0:8008
在瀏覽器內輸入:http://127.0.0.1:8008,檢查django是否運行正常。

安裝項目需要用到的python模塊

yum -y install mysql-devel
pip install mysql-python 或 pip install mysqlclient

開始部署魔鬼部署系統(github已部署好ssh)

mkdir -p /data/www
cd /data/www
git clone https://github.com/gongfuxiang/mogui.git

修改數據庫配置文件

/data/www/mogui/mogui/common/config.py
修改以下配置信息保存即可
# 數據庫
db = {
    'name' : 'mogui',       # 數據庫名稱
    'user' : 'root',        # 用戶名
    'pwd'  : 'root',        # 密碼
    'host' : 'localhost',   # 連接地址
    'port' : 3306           # 端口號
}

還記得新增實際部署的域名或ip

/data/www/mogui/mogui/settings.py

修改 ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

創建數據表

cd /data/www/mogui
python manage.py migrate

創建uwsgi配置文件 創建 /etc/uwsgi.ini

詳細可參考官網文檔 https://uwsgi-docs.readthedocs.io/en/latest/

[uwsgi]
chdir           = /data/www/mogui
module          = mogui.wsgi
master          = true
processes       = 10
socket          = 127.0.0.1:9090
vacuum          = true
pidfile         = /var/run/uwsgi.pid    
daemonize       = /var/log/uwsgi.log
uid             = 0

uwsgi常用操作

啟動uwsgi
    uwsgi --ini /etc/uwsgi.ini

uwsgi重啟
    kill -HUP `cat /var/run/uwsgi.pid`

uwsgi停止
    killall -9 uwsgi

nginx配置(記得重啟)

upstream django {
    server 127.0.0.1:9090;
}

server {
    listen      80 default;
    server_name _;
    charset     utf-8;
    client_max_body_size 75M;
    uwsgi_read_timeout 1800;
    uwsgi_send_timeout 300;
    proxy_read_timeout 300;

    location /public {
        alias /data/www/mogui/public;
    }

    location / {
        uwsgi_pass  django;
        include     uwsgi_params;
    }
}

訪問 http://127.0.0.7

閱讀全文

寬屏幻燈片插件
發表于 2017-8-15 | 瀏覽(3819) | 前端

百度網盤下載地址:https://pan.baidu.com/s/1bqcOkcJ

效果展示

源代碼平臺

閱讀全文

redis事務
發表于 2017-6-26 | 瀏覽(3127) | 服務器

一、事務

1、開啟事務 multi

2、提交事務 exec

3、取消事務 discard

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name devil
QUEUED
127.0.0.1:6379> set age 26
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
127.0.0.1:6379> get sex
"2"
127.0.0.1:6379> get age
"26"
127.0.0.1:6379>
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a 100
QUEUED
127.0.0.1:6379> del age
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get age
"26"
127.0.0.1:6379> get a
(nil)
127.0.0.1:6379>

二、樂觀鎖

client-1 開啟watch,并在事務中修改name

127.0.0.1:6379> get name
"mogui"
127.0.0.1:6379> watch name
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name devil
QUEUED
127.0.0.1:6379> exec
(nil)

client-2 修改name

127.0.0.1:6379> get name
"mogui"
127.0.0.1:6379> get name
"mogui"
127.0.0.1:6379> set name gong
OK
127.0.0.1:6379> get name
"gong"

client-1 執行exec

127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get name
"gong"

三、發布及訂閱消息

client-1 訂閱devil頻道

127.0.0.1:6379> subscribe devil
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "devil"
3) (integer) 1

client-2 發布頻道devil消息

127.0.0.1:6379> publish devil hello
(integer) 1

client-1 訂閱頻道接收到的消息

1) "message"
2) "devil"
3) "hello"

閱讀全文

HAProxy編譯安裝及配置詳解
發表于 2017-6-17 | 瀏覽(4032) | 服務器

簡介

HAProxy提供高可用性、負載均衡以及基于TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速并且可靠的一種解決方案。

HAProxy特別適用于那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。

HAProxy運行在當前的硬件上,完全可以支持數以萬計的并發連接。并且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。

HAProxy實現了一種事件驅動, 單一進程模型,此模型支持非常大的并發連接數。多進程或多線程模型受內存限制 、系統調度器限制以及無處不在的鎖限制,很少能處理數千并發連接。事件驅動模型因為在有更好的資源和時間管理的用戶空間(User-Space) 實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是為什么他們必須進行優化以 使每個CPU時間片(Cycle)做更多的工作。

結合Keepalived搭建高可用負載均衡服務器架構,詳情可參考本博客中的另一篇文章。

HAProxy官網:http://www.haproxy.org/

架構圖

Image

準備工作

mkdir /data
cd /data
mkdir soft src www
mkdir soft/haproxy

下載安裝

wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.5.tar.gz
tar -zxvf haproxy-1.7.5.tar.gz
cd haproxy-1.7.5
make TARGET=linux2628 ARCH=x86_64 PREFIX=/data/soft/haproxy
make install PREFIX=/data/soft/haproxy

參數說明

使用 [ uname -r ] 查看內核
    如:2.6.18-371.el5,此時該參數就為linux26;內核 大于2.6.28的用:TARGET=linux2628

內核版本
    TARGET=linux26

系統位數
    ARCH=x86_64

haprpxy安裝路徑
    PREFIX=/data/soft/haproxy

添加haproxy用戶和組

groupadd haproxy
useradd -g haproxy haproxy

制作haproxy操作腳本 [ vim /etc/init.d/haproxy ]

#!/bin/sh
#chkconfig: 2345 80 90
#description:haproxy run

# haproxy操作腳本
# @author   Devil
# @version  0.0.1

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/data/soft/haproxy/sbin
PROGDIR=/data/soft/haproxy
PROGNAME=haproxy
DAEMON=$PROGDIR/sbin/$PROGNAME
CONFIG=$PROGDIR/$PROGNAME.cfg
PIDFILE=$PROGDIR/$PROGNAME.pid
DESC="HAProxy daemon"
SCRIPTNAME=/etc/init.d/$PROGNAME
set -e
# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0

start()
{
    echo -n "Starting $DESC: $PROGNAME"
    $DAEMON -f $CONFIG
    echo "."
}

stop()
{
    echo -n "Stopping $DESC: $PROGNAME"
    kill $(cat $PIDFILE)
    echo "."
}

restart()
{
    echo -n "Restarting $DESC: $PROGNAME"
    $DAEMON -f $CONFIG -p $PIDFILE -st $(cat $PIDFILE)
    echo "."
}

case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        restart
    ;;
    *)
        echo "Usage: systemctl {start|stop|restart} $PROGNAME" >&2
        exit 1
    ;;
esac
exit 0

賜予可執行權限

chmod x+ /etx/init.d/haproxy

添加haproxy命令軟連接

ln /etc/init.d/haproxy /usr/bin/haproxy

注冊服務

chkconfig --add haproxy

設置開啟啟動

chkconfig haproxy on

haproxy操作命令

systemctl start haproxy     啟動
systemctl restart haproxy   重啟
systemctl stop haproxy      停止

配置文件 [ vim /data/soft/haproxy/haproxy.cfg ] 配置文件不存在則創建

#---------------------------------------------------------------------
# 全局配置
#---------------------------------------------------------------------
global
    log 127.0.0.1 local0 #[日志輸出配置,所有日志都記錄在本機,通過local0輸出]
    #log 127.0.0.1 local1 notice #定義haproxy 日志級別[error warringinfo debug]
    daemon #以后臺形式運行harpoxy
    nbproc 1 #設置進程數量
    maxconn 4000 #默認最大連接數,需考慮ulimit-n限制, 默認4000
    user haproxy #運行haproxy的用戶
    group haproxy #運行haproxy的用戶所在的組
    pidfile /data/soft/haproxy/haproxy.pid #haproxy 進程PID文件
    chroot /data/soft/haproxy #chroot運行路徑
    #ulimit-n 819200 #ulimit 的數量限制
    #debug #haproxy 調試級別,建議只在開啟單進程的時候調試
    #quiet

#---------------------------------------------------------------------
# 默認配置
#---------------------------------------------------------------------
defaults
    mode http #默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK
    log global #采用全局定義的日志
    option httplog #日志類別,采用httplog
    option dontlognull #不記錄健康檢查日志信息
    retries 3 #3次連接失敗就認為是服務器不可用,也可以通過后面設置
    option forwardfor #如果后端服務器需要獲得客戶端真實ip需要配置的參數,可以從Http Header中獲得客戶端ip
    option httpclose #每次請求完畢后主動關閉http通道,haproxy不支持keep-alive,只能模擬這種模式的實現
    #option redispatch #當serverId對應的服務器掛掉后,強制定向到其他健康的服務器,以后將不支持
    option abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接
    maxconn 6000 #默認的最大連接數
    timeout connect 5000ms #連接超時
    timeout client 30000ms #客戶端超時
    timeout server 30000ms #服務器超時
    #timeout check 2000 #心跳檢測超時
    #timeout http-keep-alive 10s #默認持久連接超時時間
    #timeout http-request 10s #默認http請求超時時間
    #timeout queue 1m #默認隊列超時時間
    balance roundrobin #設置默認負載均衡方式,輪詢方式,類似于nginx的ip_hash

#---------------------------------------------------------------------
# 統計頁面配置
#---------------------------------------------------------------------
listen stats
    bind 0.0.0.0:1080 #設置Frontend和Backend的組合體,監控組的名稱,按需要自定義名稱
    stats refresh 30s #統計頁面自動刷新時間
    stats uri /stats #統計頁面url
    stats realm Gong Cloud Haproxy #統計頁面密碼框上提示文本
    stats auth admin:admin #設置監控頁面的用戶和密碼,格式 用戶名:密碼,可以設置多個用戶名
    stats auth devil:devil #第二個用戶和密碼
    stats hide-version #隱藏統計頁面上HAProxy的版本信息
    stats admin if TRUE #設置手工啟動/禁用,后端服務器(haproxy-1.4.9以后版本)

#---------------------------------------------------------------------
# 設置haproxy錯誤頁面
#---------------------------------------------------------------------
#errorfile 403 /data/soft/haproxy/www/errorfiles/403.http
#errorfile 500 /data/soft/haproxy/www/errorfiles/500.http
#errorfile 502 /data/soft/haproxy/www/errorfiles/502.http
#errorfile 503 /data/soft/haproxy/www/errorfiles/503.http
#errorfile 504 /data/soft/haproxy/www/errorfiles/504.http

#---------------------------------------------------------------------
# 請求入口處理
#---------------------------------------------------------------------
frontend main
    # 這里建議使用bind *:80的方式,要不然做集群高可用的時候有問題,vip切換到其他機器就不能訪問了。
    bind *:80

    # 定義靜態規則
    acl url_static path_beg -i /static /images /javascript /stylesheets
    acl url_static path_end -i .jpg .gif .png .css .js .html
    acl host_static hdr_beg(host) -i img. imgs. video. videos. ftp. image. download.

    # 定義動態規則
    acl url_php path_end -i .php

    # 請求歸納
    use_backend static if url_static or host_static
    use_backend dynamic if url_php

    # 不滿足則響應backend的默認頁面
    default_backend dynamic

#---------------------------------------------------------------------
# 靜態請求處理
#---------------------------------------------------------------------
backend static
    # 請求類型
    mode http

    # 分配算法 balance roundrobin 負載輪詢,balance source 保存session值,支持static-rr,leastconn,first,uri等參數
    balance roundrobin

    # 實際處理請求的服務器列表
    # cookie 1表示serverid為1
    # weight 代表權重
    # check inter 1500 是檢測心跳頻率 
    # rise 2是2次正確認為服務器可用
    # fall 3是3次失敗認為服務器不可用
    server static01 192.168.0.100:80 cookie 1 weight 1 check inter 2000 rise 2 fall 3

#---------------------------------------------------------------------
# 動態請求處理
#---------------------------------------------------------------------
backend dynamic
    # 請求類型
    mode http

    # 分配算法 balance roundrobin 負載輪詢,balance source 保存session值,支持static-rr,leastconn,first,uri等參數
    balance roundrobin

    # 實際處理請求的服務器列表
    # cookie 1表示serverid為1
    # weight 代表權重
    # check inter 1500 是檢測心跳頻率 
    # rise 2是2次正確認為服務器可用
    # fall 3是3次失敗認為服務器不可用
    server web01 192.168.0.103:80 cookie 1 weight 1 check inter 2000 rise 2 fall 3

配置日志記錄

1、創建haproxy日志目錄
    mkdir /var/log/haproxy

2、vim /etc/rsyslog.conf 在底部添加
    # haproxy log
    $ModLoad imudp
    $UDPServerRun 514
    local0.* /var/log/haproxy/haproxy.log

3、重啟日志服務
    systemctl restart rsyslog

訪問haproxy查看狀態 [ http://host:1080/stats ]

Image

8種負載均衡算法

1、roundrobin
    表示簡單的輪詢,每個服務器根據權重輪流使用,在服務器的處理時間平均分配的情況下這是最流暢和公平的算法。該算法是動態的,對于實例啟動慢的服務器權重會在運行中調整。

2、leastconn
    連接數最少的服務器優先接收連接。leastconn建議用于長會話服務,例如LDAP、SQL、TSE等,而不適合短會話協議。如HTTP.該算法是動態的,對于實例啟動慢的服務器權重會在運行中調整。

3、static-rr
    每個服務器根據權重輪流使用,類似roundrobin,但它是靜態的,意味著運行時修改權限是無效的。另外,它對服務器的數量沒有限制。(該算法一般不用)

4、source
    對請求源IP地址進行哈希,用可用服務器的權重總數除以哈希值,根據結果進行分配。只要服務器正常,同一個客戶端IP地址總是訪問同一個服務器。如果哈希的結果隨可用服務器數量而變化,那么客戶端會定向到不同的服務器。(算法一般用于不能插入cookie的Tcp模式。它還可以用于廣域網上為拒絕使用會話cookie的客戶端提供最有效的粘連)
    該算法默認是靜態的,所以運行時修改服務器的權重是無效的,但是算法會根據“hash-type”的變化做調整。

5、uri
    表示根據請求的URI左端(問號之前)進行哈希,用可用服務器的權重總數除以哈希值,根據結果進行分配。只要服務器正常,同一個URI地址總是訪問同一個服務器。一般用于代理緩存和反病毒代理,以最大限度的提高緩存的命中率。該算法只能用于HTTP后端。(該算法一般用于后端是緩存服務器)
    該算法默認是靜態的,所以運行時修改服務器的權重是無效的,但是算法會根據“hash-type”的變化做調整。

6、url_param
    在HTTP GET請求的查詢串中查找<param>中指定的URL參數,基本上可以鎖定使用特制的URL到特定的負載均衡器節點的要求。(該算法一般用于將同一個用戶的信息發送到同一個后端服務器)
    該算法默認是靜態的,所以運行時修改服務器的權重是無效的,但是算法會根據“hash-type”的變化做調整。

7、hdr(name)
    在每個HTTP請求中查找HTTP頭<name>,HTTP頭<name>將被看作在每個HTTP請求,并針對特定的節點。(如果缺少頭或者頭沒有任何值,則用roundrobin代替)
    該算法默認是靜態的,所以運行時修改服務器的權重是無效的,但是算法會根據“hash-type”的變化做調整。

8、rdp-cookie(name)
    為每個進來的TCP請求查詢并哈希RDP cookie<name>。(該機制用于退化的持久模式,可以使同一個用戶或者同一個會話ID總是發送給同一臺服務器。如果沒有cookie,則使用roundrobin算法代替)
    該算法默認是靜態的,所以運行時修改服務器的權重是無效的,但是算法會根據“hash-type”的變化做調整。

docker鏡像下載

docker pull gongfuxiang/haproxy

閱讀全文

redis分布式緩存搭建與使用
發表于 2017-6-11 | 瀏覽(3739) | 服務器

redis官網地址 https://redis.io/

準備6臺redis服務

127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
127.0.0.1:7004
127.0.0.1:7005

下載安裝redis

mkdir /data
cd /data
mkdir src soft
cd /data/src/
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar -zxvf redis-3.2.9.tar.gz
cd redis-3.2.9
make
make install

創建集群位置

cd /data/soft
mkdir redis-cluster
cd redis-cluster
mkdir 7000 7001 7002 7003 7004 7005

拷貝配置文件

cp /data/src/redis-3.2.9/redis.conf /data/soft/redis-cluster/7000
cp /data/src/redis-3.2.9/src/redis-trib.rb /data/soft/redis-cluster/

修改配置文件

cd /data/soft/redis-cluster/7000
vim redis.conf 修改以下選項內容

port 7000
daemonize yes  # 后臺啟動
cluster-enabled yes
cluster-config-file nodes.conf  # 指定集群節點配置文件
cluster-node-timeout 5000  # 指定集群節點超時時間
appendonly yes  # 指定持久化方式

完成后分別把 redis.conf 文件拷貝到7000 ~ 7005目錄下,修改 port 對應目錄名稱的端口號

完成后分別啟動6個實例

重啟需要先刪除數據文件和節點配置文件

for((i=0;i<=5;i++)); do cd /data/soft/redis-cluster/700$i/;rm -rf appendonly.aof  dump.rdb nodes.conf; done

循環啟動redis

for((i=0;i<=5;i++)); do cd /data/soft/redis-cluster/700$i/; redis-server redis.conf; done

創建集群

/data/soft/redis-cluster/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

循環停止redis服務

for((i=0;i<=5;i++)); do redis-cli -c -p 700$i shutdown; done

啟動redis服務,啟動完成后查看實例列表 [ ps -ef | grep redis ],如下顯示則說明啟動成功

ps -ef | grep redis

root      32631      1  0 15:39 ?        00:00:00 redis-server 127.0.0.1:7000 [cluster]
root      32668      1  0 15:40 ?        00:00:00 redis-server 127.0.0.1:7001 [cluster]
root      32675      1  0 15:40 ?        00:00:00 redis-server 127.0.0.1:7002 [cluster]
root      32682      1  0 15:41 ?        00:00:00 redis-server 127.0.0.1:7003 [cluster]
root      32687      1  0 15:41 ?        00:00:00 redis-server 127.0.0.1:7004 [cluster]
root      32696      1  1 15:41 ?        00:00:00 redis-server 127.0.0.1:7005 [cluster]

安裝ruby,由于redis集群客戶端實現很少,redis集群的啟動需要用到ruby實現的redis-trib.rb,所以我們需要先安裝ruby。

yum -y install ruby

安裝gem

yum -y install rubygems

gem 安裝 redis ruby 接口

gem install redis

創建redis集群

--replicas 則指定了為 Redis Cluster 中的每個 Master 節點配備幾個 Slave 節 點,節點角色由順序決定,先 master 之后是 slave

/data/soft/redis-cluster/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005


>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: 443adf2c1d13b41866dc0dc108ffe858d931ac77 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: d74ee0110d7bcf0858ca76eb32caeca5094fa5ff 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: 13fd8b25f070382657c700fc9d8184418a82f8b6 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
S: 229a83d4997539771bf6792455c992cd215b7273 127.0.0.1:7003
   replicates 443adf2c1d13b41866dc0dc108ffe858d931ac77
S: 179a946b3ab66fac33d19316076e8c93d607a53a 127.0.0.1:7004
   replicates d74ee0110d7bcf0858ca76eb32caeca5094fa5ff
S: f6894bfcca6a22f426722a9b9843ba95cd20bb53 127.0.0.1:7005
   replicates 13fd8b25f070382657c700fc9d8184418a82f8b6
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.
....
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 443adf2c1d13b41866dc0dc108ffe858d931ac77 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: d74ee0110d7bcf0858ca76eb32caeca5094fa5ff 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: 13fd8b25f070382657c700fc9d8184418a82f8b6 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 229a83d4997539771bf6792455c992cd215b7273 127.0.0.1:7003
   slots: (0 slots) slave
   replicates 443adf2c1d13b41866dc0dc108ffe858d931ac77
S: f6894bfcca6a22f426722a9b9843ba95cd20bb53 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 13fd8b25f070382657c700fc9d8184418a82f8b6
S: 179a946b3ab66fac33d19316076e8c93d607a53a 127.0.0.1:7004
   slots: (0 slots) slave
   replicates d74ee0110d7bcf0858ca76eb32caeca5094fa5ff
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


這里輸入 [ yes ] 如下
Can I set the above configuration? (type 'yes' to accept): yes

檢查集群 狀態

/data/soft/redis-cluster/redis-trib.rb check 127.0.0.1:7000


>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 443adf2c1d13b41866dc0dc108ffe858d931ac77 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: d74ee0110d7bcf0858ca76eb32caeca5094fa5ff 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: 13fd8b25f070382657c700fc9d8184418a82f8b6 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 229a83d4997539771bf6792455c992cd215b7273 127.0.0.1:7003
   slots: (0 slots) slave
   replicates 443adf2c1d13b41866dc0dc108ffe858d931ac77
S: f6894bfcca6a22f426722a9b9843ba95cd20bb53 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 13fd8b25f070382657c700fc9d8184418a82f8b6
S: 179a946b3ab66fac33d19316076e8c93d607a53a 127.0.0.1:7004
   slots: (0 slots) slave
   replicates d74ee0110d7bcf0858ca76eb32caeca5094fa5ff
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

連接redis服務測試一下

[[email protected] src]# redis-cli -c -p 7000
127.0.0.1:7000> set name 200
-> Redirected to slot [5798] located at 127.0.0.1:7001
OK
127.0.0.1:7001> set devil mogui
-> Redirected to slot [893] located at 127.0.0.1:7000
OK
127.0.0.1:7000> get devil
"mogui"
127.0.0.1:7000> quit
[[email protected] src]# redis-cli -c -p 7003
127.0.0.1:7003> get devil
-> Redirected to slot [893] located at 127.0.0.1:7000
"mogui"
127.0.0.1:7000> 
127.0.0.1:7000> quit
[[email protected] src]# redis-cli -c -p 7002
127.0.0.1:7002> get name
-> Redirected to slot [5798] located at 127.0.0.1:7001
"200"
127.0.0.1:7001> get devil
-> Redirected to slot [893] located at 127.0.0.1:7000
"mogui"
127.0.0.1:7000> set age 20
OK
127.0.0.1:7000> quit
[[email protected] src]# redis-cli -c -p 7005
127.0.0.1:7005> get age
-> Redirected to slot [741] located at 127.0.0.1:7000
"20"
127.0.0.1:7000> set sex 30
OK
127.0.0.1:7000> quit
[[email protected] src]# redis-cli -c -p 7001
127.0.0.1:7001> get sex
-> Redirected to slot [2584] located at 127.0.0.1:7000
"30"
127.0.0.1:7000>

使用add-node命令來添加節點,第一個參數是新節點的地址,第二個參數是任意一個已經存在的節點的IP和端口

添加一個從節點,使用[ --slave ] 參數

/data/soft/redis-cluster/redis-trib.rb add-node --slave 127.0.0.1:7007 127.0.0.1:7000

添加從節點還可以指定這個從節點的主節點id,使用[ --master-id ] 參數指定masterid

/data/soft/redis-cluster/redis-trib.rb add-node --slave --master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7007 127.0.0.1:7000

重新分配哈希槽

/data/soft/redis-cluster/redis-trib.rb reshard 127.0.0.1:7006

移除一個節點,第一個參數是集群中的任意一個節點地址,第二個是需要移除的節點id(移除前請確保節點哈希槽數量是空的)當移除一個master節點的時候,如果節點有哈希槽則失敗

/data/soft/redis-cluster/redis-trib.rb del-node 127.0.0.1:7000 fea8868aeb4ce79d447b602e1cf07b4318adb852

改變從節點的主節點id[ CLUSTER REPLICATE <master-node-id> ](如把7007的主節點id改成7001的id)

[[email protected] redis-cluster]# redis-cli -c -p 7007
127.0.0.1:7007> cluster replicate cba8ca301ef0fc8039af8313d580b0a5bc8ea8cf
OK


添加一個新節點演示

cd /data/soft/redis-cluster/
cp -r 7005 7006
cd 7006
rm -rf dump.rdb appendonly.aof nodes.conf
vim redis.conf # 修改7005為7006保存
redis-server redis.conf

使用add-node命令來添加節點,第一個參數是新節點的地址,第二個參數是任意一個已經存在的節點的IP和端口. 我們可以看到新的節點已經添加到集群中

/data/soft/redis-cluster/redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000

查看7006節點是否正常加入了集群(可以看出 7006 成為了master節點,但是還未分配哈希槽)

[[email protected] redis-cluster]# redis-cli -p 7000 cluster nodes

e3cb1f4805d31dc0dc11b1e5539653b2c4144216 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
c7a0afa1c64045bad02de7478cc23f1d65a3b035 127.0.0.1:7006 master - 0 1497061063704 0 connected
64d1a9e01ca3820288c7e5c4adc3a161b7816895 127.0.0.1:7005 slave 20c27ce2235485f2d5aa5d941674d7f81ee22682 0 1497061064812 6 connected
dffe09f5b1739dc5b53f8299d20b06508eccb15d 127.0.0.1:7004 slave cba8ca301ef0fc8039af8313d580b0a5bc8ea8cf 0 1497061065820 5 connected
20c27ce2235485f2d5aa5d941674d7f81ee22682 127.0.0.1:7002 master - 0 1497061064309 3 connected 10923-16383
cba8ca301ef0fc8039af8313d580b0a5bc8ea8cf 127.0.0.1:7001 master - 0 1497061065316 2 connected 5461-10922
3f363ffcacfa225ee098819b67ab4bd5d0e5def8 127.0.0.1:7003 slave e3cb1f4805d31dc0dc11b1e5539653b2c4144216 0 1497061063805 4 connected

給7006分配哈希槽

[[email protected] redis-cluster]# /data/soft/redis-cluster/redis-trib.rb reshard 127.0.0.1:7006

How many slots do you want to move (from 1 to 16384)? 需要分配的哈希槽數量 如:100
What is the receiving node ID? 7006節點的ID 如:c7a0afa1c64045bad02de7478cc23f1d65a3b035
Source node #1:需要從哪個節點分配哈希槽,all則從所有master節點上隨機湊100個哈希槽。或者輸入節點ID換行以done結束。如輸入7001的節點id:cba8ca301ef0fc8039af8313d580b0a5bc8ea8cf
Source node #2:done
Do you want to proceed with the proposed reshard plan (yes/no)? 打印被移動的 slot 后,輸入 yes 開始移動 slot 以及對應的數據

哈希槽分配完成,可以看出7006剛好100個哈希槽數量,7001也剛好少了100個哈希槽

[[email protected] redis-cluster]# redis-cli -p 7000 cluster nodes

e3cb1f4805d31dc0dc11b1e5539653b2c4144216 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
c7a0afa1c64045bad02de7478cc23f1d65a3b035 127.0.0.1:7006 master - 0 1497061327609 7 connected 5461-5560
64d1a9e01ca3820288c7e5c4adc3a161b7816895 127.0.0.1:7005 slave 20c27ce2235485f2d5aa5d941674d7f81ee22682 0 1497061325594 6 connected
dffe09f5b1739dc5b53f8299d20b06508eccb15d 127.0.0.1:7004 slave cba8ca301ef0fc8039af8313d580b0a5bc8ea8cf 0 1497061327609 5 connected
20c27ce2235485f2d5aa5d941674d7f81ee22682 127.0.0.1:7002 master - 0 1497061326097 3 connected 10923-16383
cba8ca301ef0fc8039af8313d580b0a5bc8ea8cf 127.0.0.1:7001 master - 0 1497061327106 2 connected 5561-10922
3f363ffcacfa225ee098819b67ab4bd5d0e5def8 127.0.0.1:7003 slave e3cb1f4805d31dc0dc11b1e5539653b2c4144216 0 1497061326602 4 connected

當移除一個master節點的時候,不能有哈希槽數量(把當7002前master節點的哈希槽轉移到7006節點上去)

[[email protected] redis-cluster]# ./redis-trib.rb reshard 127.0.0.1:7002
How many slots do you want to move (from 1 to 16384)? 輸入7002的哈希槽數量,16383-10923如:5461
What is the receiving node ID? 輸入7006的id,如:c7a0afa1c64045bad02de7478cc23f1d65a3b035
Source node #1: 從哪個節點分配哈希槽,這里輸入7002的id,ID換行以done結束如:20c27ce2235485f2d5aa5d941674d7f81ee22682
Source node #2:done
Do you want to proceed with the proposed reshard plan (yes/no)? 打印被移動的 slot 后,輸入 yes 開始移動 slot 以及對應的數據

查看7002集群狀態,由此可以看到7002節點已經沒有哈希槽數量了,而7006已經多了5461個哈希槽數[ 10923-16383 ]

[[email protected] redis-cluster]# redis-cli -p 7000 cluster nodes
e3cb1f4805d31dc0dc11b1e5539653b2c4144216 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
c7a0afa1c64045bad02de7478cc23f1d65a3b035 127.0.0.1:7006 master - 0 1497070326503 7 connected 5461-5560 10923-16383
64d1a9e01ca3820288c7e5c4adc3a161b7816895 127.0.0.1:7005 slave c7a0afa1c64045bad02de7478cc23f1d65a3b035 0 1497070326000 7 connected
dffe09f5b1739dc5b53f8299d20b06508eccb15d 127.0.0.1:7004 slave cba8ca301ef0fc8039af8313d580b0a5bc8ea8cf 0 1497070327004 5 connected
20c27ce2235485f2d5aa5d941674d7f81ee22682 127.0.0.1:7002 master - 0 1497070326000 3 connected
cba8ca301ef0fc8039af8313d580b0a5bc8ea8cf 127.0.0.1:7001 master - 0 1497070327507 2 connected 5561-10922
3f363ffcacfa225ee098819b67ab4bd5d0e5def8 127.0.0.1:7003 slave e3cb1f4805d31dc0dc11b1e5539653b2c4144216 0 1497070327004 4 connected

從集群中移除7002節點

[[email protected] redis-cluster]# ./redis-trib.rb del-node 127.0.0.1:7000 20c27ce2235485f2d5aa5d941674d7f81ee22682
>>> Removing node 20c27ce2235485f2d5aa5d941674d7f81ee22682 from cluster 127.0.0.1:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

查看7002已經不在集群中了,原來的哈希槽已由7006接手,當前集群的數據也是不會受到任何影響

[[email protected] redis-cluster]# redis-cli -p 7000 cluster nodes
e3cb1f4805d31dc0dc11b1e5539653b2c4144216 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
c7a0afa1c64045bad02de7478cc23f1d65a3b035 127.0.0.1:7006 master - 0 1497070633845 7 connected 5461-5560 10923-16383
64d1a9e01ca3820288c7e5c4adc3a161b7816895 127.0.0.1:7005 slave c7a0afa1c64045bad02de7478cc23f1d65a3b035 0 1497070634348 7 connected
dffe09f5b1739dc5b53f8299d20b06508eccb15d 127.0.0.1:7004 slave cba8ca301ef0fc8039af8313d580b0a5bc8ea8cf 0 1497070633343 5 connected
cba8ca301ef0fc8039af8313d580b0a5bc8ea8cf 127.0.0.1:7001 master - 0 1497070632843 2 connected 5561-10922
3f363ffcacfa225ee098819b67ab4bd5d0e5def8 127.0.0.1:7003 slave e3cb1f4805d31dc0dc11b1e5539653b2c4144216 0 1497070632340 4 connected

添加7002為master,7007為slave兩個節點(可以看出7002為master還未分配哈希槽,7007為slave)

[[email protected] redis-cluster]# ./redis-trib.rb add-node 127.0.0.1:7002 127.0.0.1:7000
[[email protected] redis-cluster]# ./redis-trib.rb add-node --slave 127.0.0.1:7007 127.0.0.1:7000

[[email protected] redis-cluster]# redis-cli -p 7000 cluster nodes
e3cb1f4805d31dc0dc11b1e5539653b2c4144216 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
c7a0afa1c64045bad02de7478cc23f1d65a3b035 127.0.0.1:7006 master - 0 1497078346719 7 connected 5461-5560 10923-16383
64d1a9e01ca3820288c7e5c4adc3a161b7816895 127.0.0.1:7005 slave c7a0afa1c64045bad02de7478cc23f1d65a3b035 0 1497078346216 7 connected
dffe09f5b1739dc5b53f8299d20b06508eccb15d 127.0.0.1:7004 slave cba8ca301ef0fc8039af8313d580b0a5bc8ea8cf 0 1497078347221 5 connected
bde1b4378b10c6c7fbb8ba62189fc4d8fbbc6da7 127.0.0.1:7007 slave a7aeb2c3bef177ff671c5304d3baf0a825025d3c 0 1497078347723 0 connected
cba8ca301ef0fc8039af8313d580b0a5bc8ea8cf 127.0.0.1:7001 master - 0 1497078347221 2 connected 5561-10922
a7aeb2c3bef177ff671c5304d3baf0a825025d3c 127.0.0.1:7002 master - 0 1497078346719 0 connected
3f363ffcacfa225ee098819b67ab4bd5d0e5def8 127.0.0.1:7003 slave e3cb1f4805d31dc0dc11b1e5539653b2c4144216 0 1497078348226 4 connected

把7002節點從集群中移除(7002還未分配哈希槽數量,所以可以直接移除成功)

[[email protected] redis-cluster]# ./redis-trib.rb del-node 127.0.0.1:7000 a7aeb2c3bef177ff671c5304d3baf0a825025d3c
>>> Removing node a7aeb2c3bef177ff671c5304d3baf0a825025d3c from cluster 127.0.0.1:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> 127.0.0.1:7007 as replica of 127.0.0.1:7000
>>> SHUTDOWN the node.

把7007節點中添加點數據

[[email protected] redis-cluster]# ./redis-trib.rb del-node 127.0.0.1:7000 bde1b4378b10c6c7fbb8ba62189fc4d8fbbc6da7
>>> Removing node bde1b4378b10c6c7fbb8ba62189fc4d8fbbc6da7 from cluster 127.0.0.1:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

PHP中使用方式

<?php

$redis = new RedisCluster(null, ['127.0.0.1:7000', '127.0.0.1:7001', '127.0.0.1:7002', '127.0.0.1:7003', '127.0.0.1:7004', '127.0.0.1:7005']);
var_dump($redis->set('gong', 'gongfuxiang'));
var_dump($redis->set('xxx', 'XIANG'));
var_dump($redis->get('devil'));
var_dump($redis->get('sex'));
var_dump($redis->get('age'));
var_dump($redis->get('ggg'));
var_dump($redis->get('ppp'));
?>

docker鏡像下載

docker pull gongfuxiang/centos7.3-redis-cluster

閱讀全文

Centos7下配置php-fpm啟動服務腳本
發表于 2017-5-29 | 瀏覽(3988) | 服務器

新增配置文件,根據自己安裝的php-fpm路徑修改   vim /usr/lib/systemd/system/php-fpm.service

[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target

[Service]
Type=simple
PIDFILE=/data/soft/php56/var/run/php-fpm.pid
ExecStart=/data/soft/php56/sbin/php-fpm --nodaemonize --fpm-config /data/soft/php56/etc/php-fpm.conf
ExecRestart=/bin/kill -USR2 $PIDFILE
ExecStop=/bin/kill -SIGINT $PIDFILE

[Install]
WantedBy=multi-user.target

增加開機啟動

systemctl enable php-fpm.service

操作命令

啟動
systemctl start php-fpm.service 

停止
systemctl stop php-fpm.service 

重啟
systemctl restart php-fpm.service 

閱讀全文

Centos7下配置nginx啟動服務腳本
發表于 2017-5-29 | 瀏覽(4468) | 服務器

1:nginx配置文件,nginx路徑根據自己安裝的位置而修改  vim /etc/init.d/nginx

#! /bin/bash
#chkconfig: 2345 80 90
#description:nginx run

# nginx啟動腳本
# @author	Devil
# @version	0.0.1
# @date		2017-05-29

PATH=/data/soft/nginx
DESC="nginx daemon"
NAME=nginx
DAEMON=$PATH/$NAME
CONFIGFILE=$PATH/$NAME.conf
PIDFILE=$PATH/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
set -e
[ -x "$DAEMON" ] || exit 0
do_start()
{
	$DAEMON -c $CONFIGFILE || echo -n "nginx already running"
}
do_stop()
{
	$DAEMON -s stop || echo -n "nginx not running"
}
do_reload()
{
	$DAEMON -s reload || echo -n "nginx can't reload"
}
case "$1" in
	start)
		echo -n "Starting $DESC: $NAME"
		do_start
		echo "."
	;;
	stop)
		echo -n "Stopping $DESC: $NAME"
		do_stop
		echo "."
	;;
	reload|graceful)
		echo -n "Reloading $DESC configuration..."
		do_reload
		echo "."
	;;
	restart)
		echo -n "Restarting $DESC: $NAME"
		do_stop
		do_start
		echo "."
	;;
	*)
		echo "Usage: $SCRIPTNAME {start|stop|reload|restart}" >&2
		exit 3
	;;
esac
exit 0

2:設置執行權限

chmod a+x /etc/init.d/nginx

3:注冊成服務

chkconfig --add nginx

4:設置開機啟動

chkconfig nginx on

5:重啟, 查看nginx服務是否自動啟動

shutdown -h 0 -r

ps -ef | grep nginx

6:對nginx服務執行停止/啟動/重新讀取配置文件操作

啟動
systemctl start nginx.service

重載
systemctl reload nginx.service

停止
systemctl top nginx.service

重啟
systemctl restart nginx.service

閱讀全文

CentOS安裝netdata監控服務器
發表于 2017-5-19 | 瀏覽(4684) | 服務器

效果圖

Image

安裝一些依賴包

yum -y install zlib-devel libuuid-devel libmnl-devel gcc make git autoconf autogen automake pkgconfig

安裝netdata

mkdir -p /data/src
cd /data/src
git clone https://github.com/firehol/netdata.git
./netdata-installer.sh 

查看端口是否已經運行(如果存在netdata記錄就不需要再次啟動了)

netstat -ntlp | grep 19999

啟動netdata(默認安裝完成就已經啟動了)

/usr/sbin/netdata

配置web訪問,采用nginx反向代理(創建 netdata.conf 完成后重載nginx)

upstream backend {  
	server 127.0.0.1:19999;
	keepalive 64;
}

server {  
	listen 		80;
	server_name	netdata.gong.gg;

	location / {  
		proxy_set_header X-Forwarded-Host $host;
		proxy_set_header X-Forwarded-Server $host;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_pass http://backend;
		proxy_http_version 1.1;
		proxy_pass_request_headers on;
		proxy_set_header Connection "keep-alive";
		proxy_store off;
	}
}

配置完成,訪問查看監控信息

http://netdata.gong.gg/

1、放開防火墻 19999 端口,netdata會自動拉取該端口的服務器列表

2、netdata訪問是沒有限制的,我們使用htpasswd需要用戶名和密碼才能訪問,參考博客中 htpasswd 的教程

閱讀全文

TOP
急速赛车计划软件 福利彩票30选5规则