无法向Redis群集添加值 - 群集已关闭

时间:2017-04-05 08:12:55

标签: redis cluster-computing redis-cluster

我有4个节点,3个是主节点,其中1个是从节点。我试图通过(error) CLUSTERDOWN The cluster is down 添加一个简单的字符串,但每当我这样做时,我都会收到此错误:

127.0.0.1:7000cluster info

cluster_state:fail

cluster_slots_assigned:11

cluster_slots_ok:11

cluster_slots_pfail:0

cluster_slots_fail:0

cluster_known_nodes:4

cluster_size:3

cluster_current_epoch:3

cluster_my_epoch:3

cluster_stats_messages_sent:9262

cluster_stats_messages_received:9160

以下是我的群集信息

87982f22cf8fb12c1247a74a2c26cdd1b84a3b88 192.168.2.32:7000 slave bc1c56ef4598fb4ef9d26c804c5fabd462415f71 1492000375488 1492000374508 3 connected

9527ba919a8dcfaeb33d25ef805e0f679276dc8d 192.168.2.35:7000 master - 1492000375488 1492000374508 2 connected 16380

ff999fd6cbe0e843d1a49f7bbac1cb759c3a2d47 192.168.2.33:7000 master - 1492000375488 1492000374508 0 connected 16381

bc1c56ef4598fb4ef9d26c804c5fabd462415f71 127.0.0.1:7000 myself,master - 0 0 3 connected 1-8 16383

我正在使用 Redis-x64-3.0.503 。请让我知道如何解决这个问题

群集节点:

<script>

export default {
    /*
        Fuentes:

        camera
        https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-camera/index.html#takePicture

        qrscanner
        https://github.com/bitpay/cordova-plugin-qrscanner#prepare

    */
    mounted () {
        this.prepDevice()
    },
    data () {
        return {
            imageURI: '',
            authorized: false,
            selection: 'standard',
            selectOptions: [
                {
                    label: 'Camera-thumbnail',
                    value: 'camera-thmb'
                },
                {
                    label: 'Standard',
                    value: 'standard'
                }
            ],
            enableVisibility: 'hidden',
            backColor: 'transparent'
        }
    },
    methods: {
        prepDevice () {
            QRScanner.prepare(this.onDone)
        },
        onDone: function (err, status) {
            if(err) {
                alert("preparing: error code = " + err.code)
            }
            if(status.authorized) {
                this.authorized = true
            } else if (status.denied || !status.authorized) {
                this.openSettings()
            } else {
                //No se obtuvo permiso
            }
        },
        goScan: function () {
            //--->>> Funciona pero el escaneo es a ciegas (vista en negro) <<<---

            this.authorized = false

            QRScanner.show()

            /*
                var html = document.getElementsByTagName("*")
                for (var i=0; i<html.length; i++) {
                    html[i].style.backgroundColor = "transparent"
                }
            */


            //QRScanner.enableLight()
            QRScanner.scan(this.displayContents)
        },
        displayContents: function (err, text) {
            if(err){
                alert("scanning: error code = " + err.code)
                if(err.name === 'SCAN_CANCELED') {
                    alert("The scan was canceled before a QR code was found.")
                }
            } else {
                alert(text)
            }
            //QRScanner.hide()
            //QRScanner.disableLight()
            QRScanner.destroy() // hide, cancelScan...
            this.authorized = true
        },
        cancelScan() {
            QRScanner.cancelScan()
            this.authorized = true
        },
        openSettings() {
            if(status.canOpenSettings){
                if(confirm("Would you like to enable QR code scanning? You can allow camera access in your settings.")){
                    QRScanner.openSettings();
                }
            }
        }
    }
}

4 个答案:

答案 0 :(得分:5)

只是加上并简化@neuront所说的内容。

Redis将数据存储在哈希槽中。为此,您需要了解Hasmaps或Hashtables的工作原理。对于我们的参考,redis有一个16384个槽的常量,用于分配和分发给所有主服务器。

现在,如果我们查看您发布的节点配置并使用redis documentation引用它,您会看到结束数字表示分配给主设备的插槽。

在你的情况下,这就是它的样子

... slave  ... connected
... master ... connected 16380
... master ... connected 16381
... master ... connected 1-8 16380

因此,所有计算机都连接在一起形成集群,但并非所有散列插槽都分配用于存储信息。应该是这样的

... slave  ... connected
... master ... connected 1-5461
... master ... connected 5462-10922
... master ... connected 10923-16384

你知道,现在我们正在分配所有散列槽的范围,如文档所述

  

slot:哈希槽号或范围。从参数编号9开始,但总共可能有多达16384个条目(从未达到限制)。这是此节点提供的散列槽列表。如果条目只是一个数字,则解析为这样。如果它是一个范围,则它的形式为start-end,表示该节点负责从头到尾的所有哈希槽,包括起始值和结束值。

特别是在您的情况下,当您使用密钥 foo 存储某些数据时,它必须已分配给未在群集中注册的其他插槽。

由于您使用的是Windows,因此您必须手动设置分发。为此,你必须做这样的事情(这是在Linux中,转换为Windows命令)

for slot in {0..5400}; do redis-cli -h master1 -p 6379 CLUSTER ADDSLOTS $slot; done;

取自article

希望它有所帮助。

答案 1 :(得分:3)

只分配了11个插槽,因此您的群集已关闭,就像消息告诉您的那样。这些广告位在16380 192.168.2.35:700016381192.168.2.33:70001-8 16383127.0.0.1:7000

直接原因是你需要将所有16384个插槽(0-16383)分配给集群,但我认为这是由配置错误引起的。

您的节点具有本地主机地址127.0.0.1:7000。但是,192.168.2.33:7000也是127.0.0.1:7000,而192.168.2.35:7000也是127.0.0.1:7000。这个localhost地址问题使得一个节点无法从另一个节点告诉自己,我认为这会引起混乱。

我建议您按cluster reset命令重置所有节点,然后重新创建群集,并确保这次使用的是192.168.*.*地址。

答案 2 :(得分:1)

@ user1829319以下是添加插槽的等效窗口:

for /l %s in (0, 1, 8191) do redis-cli -h 127.0.0.1 -p 6379 CLUSTER ADDSLOTS %s
for /l %s in (8192, 1, 16383) do redis-cli -h 127.0.0.1 -p 6380 CLUSTER ADDSLOTS %s

答案 3 :(得分:0)

您应该通过全部刷新并重置集群来重新创建集群,在下一个集群设置中,请确保您已确认所有插槽均已分配给主服务器,或者未使用>集群插槽